34

使用Apache Commons CSV库解析 CSV 文件时出现以下错误。

Exception in thread "main" java.io.IOException: (line 2) invalid char between encapsulated token and delimiter

at org.apache.commons.csv.Lexer.parseEncapsulatedToken(Lexer.java:275)
at org.apache.commons.csv.Lexer.nextToken(Lexer.java:152)
at org.apache.commons.csv.CSVParser.nextRecord(CSVParser.java:450)
at org.apache.commons.csv.CSVParser.getRecords(CSVParser.java:327)
at parse.csv.file.CSVFileParser.main(CSVFileParser.java:29)

这个错误是什么意思?

4

5 回答 5

48

当我们在数据中嵌入报价时,我们遇到了这个问题。

0,"020"1,"BS:5252525  ORDER:99999"4

应用的解决方案是CSVFormat csvFileFormat = CSVFormat.DEFAULT.withQuote(null);

@Cuga 提示帮助我们解决了问题。谢谢@Cuga

完整代码是

    public static void main(String[] args) throws IOException {
    FileReader fileReader = null;
    CSVFormat csvFileFormat = CSVFormat.DEFAULT.withQuote(null);
    String fileName = "test.csv";

    fileReader = new FileReader(fileName);
    CSVParser csvFileParser = new CSVParser(fileReader, csvFileFormat);

    List<CSVRecord> csvRecords = csvFileParser.getRecords();

    for (CSVRecord csvRecord : csvRecords) {
        System.out.println(csvRecord);
    }
    csvFileParser.close();
}

结果是

CSVRecord [comment=null, mapping=null, recordNumber=1, values=[0, "020"1, "BS:5252525  ORDER:99999"4]]
于 2016-03-31T09:55:10.503 回答
8

CSV 文件中的该行在您的一个单元格与行尾、文件结尾或下一个单元格之间包含无效字符。一个非常常见的原因是未能转义封装字符(用于“包装”每个单元格的字符,因此 CSV 知道单元格(令牌)的开始和结束位置。

于 2014-11-04T07:52:30.987 回答
7

我找到了问题的解决方案。我的 CSV 文件之一具有如下属性: “带有嵌套“引号”的属性”

由于属性中的嵌套引号,解析器失败。

为避免上述问题,将嵌套引用转义如下: “attribute with nested """"quote"""""

这是解决问题的一种方法。

于 2014-11-04T12:05:07.523 回答
2

我们在同样的错误中遇到了这个错误,数据在其他未引用的输入中包含引号。IE:

some cell|this "cell" caused issues|other data

很难找到,但在Apache 的文档中,他们提到了withQuote()可以null作为值的方法。

我们收到了完全相同的错误消息,这(谢天谢地)最终为我们解决了这个问题。

于 2016-01-19T16:11:09.637 回答
1

当我忘记调用.withNullString("")我的CSVFormat. 基本上,此异常总是在以下情况下发生:

  • 你的报价符号是错误的
  • 你的空字符串表示是错误的
  • 你的列分隔符字符是错误的

确保您了解格式的详细信息。此外,一些程序使用前导字节顺序标记(例如,Excel 使用\uFEFF)来表示文件的编码。这也可能使您的解析器绊倒。

于 2020-04-28T16:21:43.160 回答