Apache常见CSV格式化程序:IOException:封装的标记和分隔符之间的无效字符

时间:2018-05-19 09:49:03

标签: 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_DELIMITER是,

输出

  1. CSV解析后的Field1值应为:Ryan,R“u”bianes
  2. CSV解析后的Field5值应为:South delhi,Rohini 122001
  3. 例外:引起:java.io.IOException :(第2行)封装的令牌和分隔符之间的无效字符

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许可证)