java - java中使用CSV解析器实现键值解析器

标签 java csv parsing univocity

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

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

代码有问题还是解析器错误?

问候,
哈里

最佳答案

此处是该库的作者。这不是解析器错误。您遇到的问题是您没有解析 CSV 文件。

当解析器看到:dstcountry="United,后跟一个空格(这是您的分隔符)时,它会将其视为一个值。

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

再次强调,您不是在处理 CSV。您在这里唯一可以做的就是使用 2 个解析器实例:一个用于分解 = 周围的行,另一个用于分解结果中由 分隔的值第一个解析器。例如:

    CsvParserSettings parserSettings = new CsvParserSettings();
    //break down the rows around the `=` character
    parserSettings.getFormat().setDelimiter('=');

    CsvParser keyValueParser = new CsvParser(parserSettings);
    String line = "dstcountry=\"United States\" date=2018-12-13 time=23:47:32";
    String[] keyPairs = keyValueParser.parseLine(line);

    //break down each value around the whitespace.
    parserSettings.getFormat().setDelimiter(' ');
    CsvParser valueParser = new CsvParser(parserSettings);

    //add all values to a list
    List<String> row = new ArrayList<String>();

    for(String value : keyPairs){
        //if a value has a whitespace, break it down using the the other parser instance
        String[] values = valueParser.parseLine(value);

        Collections.addAll(row, values);
    }

    //here is your result
    System.out.println(row);

这将打印出:

[目的地国家/地区,美国,​​日期,2018-12-13,时间,23:47:32]

您现在已经有了关键值。以下代码将根据您的需要打印出来:

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

输出:

目的地国家/地区 = 美国

日期 = 2018-12-13

时间 = 23:47:32

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

关于java - java中使用CSV解析器实现键值解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53774780/

相关文章:

java - Path Class(WatchService) 如何与 FileBody 配合进行 API 调用

javascript - 将 CSV 数据解析为 JS 对象以在图表中使用。 Uncaught ReferenceError : data is not defined(jsfiddle included)

python - 数学表达式评估

java - Apache 通用 CSV 格式化程序 : IOException: invalid char between encapsulated token and delimiter

ruby - 如何使用 Ruby 将列标题写入 csv 文件?

c++ - Boost Spirit 换行和输入结束

java - 无法删除我的 ip_address 中的前导零

java - 查找给定邻接矩阵中有多少个相连的节点组

java - 使用类似的界面进行 2 级订购

java - 我如何在java中制定jess规则