2016-09-20 7 views
1

Я пытаюсь выяснить, лучший способ использовать университет парсер для обработки лог-файл CSV с линиями выглядит, как показано ниже,однозначность анализатор - Обработка строк с фантастическими конструкциями

«23.62.3.74», 80, «testUserName», 147653, «Устройство сбора журналов 100», «31/02/15 00:05:10 GMT», - 1, «10.37.255.3», «TCP», «destination_ip = 192.62.3.74 | product_id = 0071 | option1_type = (s-dns) | proxy_machine_ip = 10.1.255.3 "

Как вы можете видеть, это файл с разделителями-запятыми, но последний столбец имеет кучу значений с префиксами с именами полей. Мое требование - выборочно извлекать значения из нормальных полей и из этого последнего большого поля.

Я знаю главный процессор строк в Univocity, но я сомневаюсь, что он вписывается в эту категорию. Не могли бы вы направить меня в правильном направлении?

Примечание: Я могу обрабатывать поля с префиксом имени в rowProcessed(String[] row, ParsingContext context), если я реализую процессор строк, но, если возможно, я ищу что-то родное для Univocity?

Спасибо, R

ответ

1

Там нет ничего родного в парсер для этого. Вероятно, самый простой способ сделать это - иметь RowProcessor, как вы упомянули.

Одна вещь, вы можете попробовать сделать, чтобы сделать вашу жизнь проще, чтобы использовать другой экземпляр CsvParser разобрать, что последняя запись:

//initialize a parser for the pipe separated bit 
CsvParserSettings detailSettings = new CsvParserSettings(); 
detailSettings.getFormat().setDelimiter('='); 
detailSettings.getFormat().setLineSeparator("|"); 
CsvParser detailParser = new CsvParser(detailSettings); 

//here is the content of the last column (assuming you got it from the parser) 
String details = "destination_ip=192.62.3.74|product_id=0071|option1_type=(s-dns)|proxy_machine_ip=10.1.255.3"; 

//The result will be a list of pairs 
List<String[]> pairs = detailParser.parseAll(new StringReader(details)); 

//You can add the pairs to a map 
Map<String, String> map = new HashMap<String, String>(); 
for (String[] pair : pairs) { 
    map.put(pair[0], pair[1]); 
} 

//this should print: {destination_ip=192.62.3.74, product_id=0071, proxy_machine_ip=10.1.255.3, option1_type=(s-dns)} 
System.out.println(map); 

Это не будет очень быстро, но по крайней мере это легко работать с картой, если этот вход может иметь случайные имена столбцов и связанные с ними значения.

+0

Спасибо, что это было полезно, меня немного беспокоит производительность из-за жестких требований к производительности. Если я могу пойти на обработку этого в процессоре строк и смотрю на «ConcurrentRowProcessor», я могу попробовать попробовать, как я могу выжать. Приветствия .. R –

+1

Рад помочь. Я попытаюсь придумать способ более легко обрабатывать подобные требования и добавить его в библиотеку. Такая проблема не является чем-то необычным. –

+1

Отличный .. да, эти файлы журналов (Common Event Format) являются общими, они довольно большие в размере линии. Будет интересно увидеть встроенную поддержку таких форматов. Опять же, как я сказал в прошлый раз, когда я получаю некоторое свободное время, я могу выкопать часть вашей базы кода и снять с вас PR :) –

 Смежные вопросы

  • Нет связанных вопросов^_^