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
代码有问题还是这是解析器错误?
问候,
哈里
解决方案
lib的作者在这里。这不是解析器错误。您在这里遇到的问题是您没有解析 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);
这将打印出:
[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
希望这会有所帮助,并感谢您使用我们的解析器!
推荐阅读
- windows - 检查内存转储中的 PE 文件是否已映射或“原始”的最合适方法
- swift - AVCaptureSession + AVAudioEngine + AVPlayer=来自接收器和扬声器而不是扬声器的低音频
- rest - 在内容管理 RestAPI 中应该如何处理图像?
- laravel - Laravel 房间预订问题
- java - AWS EC2 t3.medium | Maven慢编译
- java - 如何在开头用特殊字符替换字母?
- c# - 如何在 WPF C# 中嵌入视频文件并更改源
- reactjs - 使用反应材质ui对话框时如何防止重新渲染
- python - 简化 groupby 流程
- variables - 为什么不能使用变量代替按钮名称来使用按钮的属性?