有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Univocity解析器处理具有奇怪结构的行

我正试图找出使用University parser处理CSV日志文件的最佳方法,如下所示

“23.62.3.74”,80,“testUserName”,147653,“日志收集设备100”,“31/02/15 00:05:10 GMT”,-1,“10.37.255.3”,“TCP”,“目的地ip=192.62.3.74 |产品id=0071 |选项1 |类型=(s-dns)|代理机器ip=10.1.255.3”

如您所见,这是一个以逗号分隔的文件,但最后一列中有一堆以字段名为前缀的值。我的要求是从普通字段和 有选择地从这最后一个大领域

我知道Univocity的主明细行处理器,但我怀疑这是否属于该类别。你能告诉我正确的方向吗

注意:如果我实现了一个行处理器,我可以处理rowProcessed(String[] row, ParsingContext context)中的名称前缀字段,但是如果可能的话,我正在寻找Univocity的原生内容

谢谢, R


共 (1) 个答案

  1. # 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);
    

    这不会非常快,但如果输入可以有随机的列名和与之关联的值,那么使用映射至少很容易