我正在尝试使用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_DELIMITER是,
输出
例外:引起:java.io.IOException :(第2行)封装的令牌和分隔符之间的无效字符
答案 0 :(得分:3)
问题是您的文件未遵循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
&#的字段,则无法消除嵌入式逗号和字段分隔符的歧义。 34。
CSV文件中的引用规则在各个地方列出,包括RFC 4180。
答案 1 :(得分:0)
这里的问题是引号没有被正确转义。你的解析器没有处理它。尝试univocity-parsers,因为这是我知道的唯一可以在引用值内处理未转义引号的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("-----");
}
这将打印:
[Ryan, R"u"bianes]
[dummy@gmail.com]
[29445]
[626]
[South delhi, Rohini 122001]
-----
希望它有所帮助。
披露:我是这个库的作者,它是开源和免费的(Apache 2.0许可证)