有 Java 编程相关的问题?

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

在java中用CSV解析器实现键值解析器

我正在编写一个程序来解析基于键值的日志,如下所示:

dstcountry="United States" date=2018-12-13 time=23:47:32

我正在使用Univocity解析器来实现这一点。这是我的密码

CsvParserSettings parserSettings = new CsvParserSettings();
parserSettings.getFormat().setDelimiter(' ');
parserSettings.getFormat().setQuote('"');
parserSettings.getFormat().setQuoteEscape('"');
parserSettings.getFormat().setCharToEscapeQuoteEscaping('"');
CsvParser keyValueParser = new CsvParser(parserSettings);
String line = "dstcountry=\"United States\" date=2018-12-13 time=23:47:32";
String[] resp = keyValueParser.parseLine(line);

但是解析器给了我这个输出:

dstcountry="United, 
States", 
date=2018-12-13, 
time=23:47:32

达到预期产量的地方

dstcountry="United States", 
date=2018-12-13, 
time=23:47:32

代码有问题吗?或者这是一个解析器错误

问候,
哈里


共 (1) 个答案

  1. # 1 楼答案

    这里是lib的作者。这不是解析器错误。这里的问题是,您没有解析CSV文件

    当解析器看到:^ {},后面跟着一个空格(这是你的定界符),它会把它当作一个值。

    引号设置仅适用于以引号字符开头的字段。由于您的输入不是"dstcountry=""United States""",解析器将无法按照您的意愿处理此问题。没有CSV解析器可以为您做到这一点

    同样,您没有处理CSV。这里唯一能做的就是使用两个解析器实例:一个用于分解=周围的行,另一个用于分解由 in the result of the first parser. For example:

    ^{pr 1}$

    This will print out:

    [dstcountry, United States, date, 2018-12-13, time, 23:47:32]分隔的值

    现在你有了关键值。以下代码将根据需要打印此文件:

        for (int i = 0; i < row.size(); i += 2) {
            System.out.println(row.get(i) + " = " + row.get(i + 1));
        }
    

    输出:

    dstcountry = United States

    date = 2018-12-13

    time = 23:47:32

    希望这对您有所帮助,并感谢您使用我们的解析器