Apache Commons CSV库中封装的令牌和分隔符之间的字符无效



我在使用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)

这个错误是什么意思?

我们在数据中嵌入引号时遇到了这个问题。

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]]

CSV文件中的那一行在其中一个单元格与行末、文件末或下一个单元格之间包含无效字符。造成这种情况的一个常见原因是无法转义封装字符(用于"包裹"每个单元格的字符,因此CSV知道单元格(令牌)的起点和终点。

我找到了问题的解决方案。我的一个CSV文件具有如下属性:"带有嵌套"quote"的属性"

由于属性中嵌套了引号,解析程序失败。

为了避免上述问题,请按如下方式转义嵌套引号:"带有嵌套""quote""的属性

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

我们在同一个错误中遇到了这个问题,数据在其他未加引号的输入中包含引号。即:

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

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

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

当我忘记在CSVFormat上调用.withNullString("")时,遇到了这个问题。基本上,此异常总是在以下情况下发生:

  • 您的引号错误
  • 您的空字符串表示方式错误
  • 列分隔符字符错误

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

相关内容

  • 没有找到相关文章

最新更新