Java Apache公共CSV格式化程序:IOException:封装的令牌和分隔符之间的字符无效
我正在尝试使用JakartaCommons CSV解析CSV文件 样本输入文件Java Apache公共CSV格式化程序:IOException:封装的令牌和分隔符之间的字符无效,java,csv,apache-commons,opencsv,apache-commons-csv,Java,Csv,Apache Commons,Opencsv,Apache Commons Csv,我正在尝试使用JakartaCommons CSV解析CSV文件 样本输入文件 Field1,Field2,Field3,Field4,Field5 "Ryan, R"u"bianes"," dummy@gmail.com","29445","626","South delhi, Rohini 122001" 格式化程序:CSVFormat.newFormat(',')。withIgnoreEmptyLines()。withQuote('“')) CSV_分隔符为 输出 CSV解析后的Fie
Field1,Field2,Field3,Field4,Field5
"Ryan, R"u"bianes"," dummy@gmail.com","29445","626","South delhi, Rohini 122001"
格式化程序:CSVFormat.newFormat(',')。withIgnoreEmptyLines()。withQuote('“'))
CSV_分隔符为
输出
异常:由以下原因引起:java.io.IOException:(第2行)封装的标记和分隔符之间的字符无效问题是您的文件没有遵循CSV文件中引用的公认标准。在引用字符串中表示引用的正确方法是重复引用。例如
Field1,Field2,Field3,Field4,Field5
"Ryan, R""u""bianes"," dummy@gmail.com","29445","626","South delhi, Rohini 122001"
如果您将自己限制为CSV引用的标准形式,Apache Commons CSV解析器应该可以工作
不幸的是,为变量格式编写一致的解析器是不可行的,因为如果需要表示包含“Ryan R”、“baines
”的字段,则无法消除嵌入的逗号和字段分隔符的歧义
CSV文件中的引号规则在不同的地方都有规定,包括。这里的问题是引号没有正确转义。您的解析器无法处理这一点。请尝试,因为这是我知道的唯一一个可以处理引号内未转义引号的java解析器。它也比Commons CSV快4倍。请尝试以下代码:
//configure the parser to handle your situation
CsvParserSettings settings = new CsvParserSettings();
settings.setHeaderExtractionEnabled(true); //uses first line as headers
settings.setUnescapedQuoteHandling(STOP_AT_CLOSING_QUOTE);
settings.trimQuotedValues(true); //trim whitespace around values in quotes
//create the parser
CsvParser parser = new CsvParser(settings);
String input = "" +
"Field1,Field2,Field3,Field4,Field5\n" +
"\"Ryan, R\"u\"bianes\",\" dummy@gmail.com\",\"29445\",\"626\",\"South delhi, Rohini 122001\"";
//parse your input
List<String[]> rows = parser.parseAll(new StringReader(input));
//print the parsed values
for(String[] row : rows){
for(String value : row){
System.out.println('[' + value + ']');
}
System.out.println("-----");
}
希望能有帮助
披露:我是这个库的作者,它是开源和免费的(Apache 2.0许可证)
“Ryan,R”u“bianes”“
处理此问题,请检查我的其他answer@stephen-有没有办法跳过这一行,继续处理下一组行?看看Commons CSV解析器代码,我想答案是否定的。@stephen-c这也是我的直觉,通过查看代码,但这是一个理想情况下应该存在的功能。任何建议的解决方法。我正在考虑这样做{try{while(csvRecords.hasNext()){csvrecordrecord=csvRecords.next();}}}catch(异常e){log.error(“解析一条输入记录时发生异常”);}}while(csvRecords.hasNext());这可能有用。(试试看!!!)但我怀疑。在抛出异常之前,我没有注意到任何代码要跳到行的末尾。对于我问题中的讨厌的示例,它做了什么?请仔细查看。它通过正确处理未替换的引号来解析您的中断输入。正如您所看到的,我使用了您的示例输入进行测试。因为它是一个简单的字符串,所以我在每个引号前面加了斜杠。将此代码与实际输入文件一起使用。
[Ryan, R"u"bianes]
[dummy@gmail.com]
[29445]
[626]
[South delhi, Rohini 122001]
-----