3

我正在尝试使用 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

异常:由:java.io.IOException:(第 2 行)封装令牌和分隔符之间的无效字符引起

4

2 回答 2

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”的字段,则无法消除嵌入的逗号和字段分隔符的歧义。

CSV 文件中的引用规则在包括RFC 4180在内的各个地方都有规定。

于 2018-05-19T10:05:29.310 回答
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 许可证)

于 2018-05-19T17:29:49.847 回答