我正在尝试使用大学解析器来处理CSV日志文件的最佳方法,如下所示:
“23.62.3.74”,80,“testUserName”,147653,“Log Collection Device 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
答案 0 :(得分: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);
这不会非常快,但如果输入可以包含随机列名和与之关联的值,那么至少可以很容易地使用地图。