在Apache Commons CSV库中,封装标记和分隔符之间存在无效字符。

38

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

这个错误的意思是什么?


2
你能否展示一下你的 CSV 文件第二行吗?如果它很长的话。 - Santhosh
这是示例行2: "---","88104310D64DCG","2014年10月20日","上午10:03","2014年10月20日","上午10:03","00:00:00","","","172.21.128.74","","h323",256,"","OUTGOING",45,1,0,"","","用户:---","172.21.128.74","","","","","","","","失败的尝试;通话已结束;滚动。",16,0,0.0,0.0,0.0,0.0,0.0,0.0,0,0,0.0,0.0,0,0 - Santhosh Sridhar
另一个观察是,如果我在 Microsoft Excel 工作簿中打开 CSV 文件,进行一些修改,然后保存它。现在运行解析器程序,它可以工作了! - Santhosh Sridhar
3
@SanthoshSridhar请将那些额外的信息整齐地放入问题中,而不是作为评论发布。使用您的问题标签下方的“编辑”链接(如果在Web浏览器中)。 - Basil Bourque
5个回答

52

当我们的数据中有嵌套引用时,我们遇到了这个问题。

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

10

CSV文件中的那一行在单元格和行末、文件末或下一个单元格之间包含无效字符。这种情况非常常见的原因是未能转义封装字符(即用于“包装”每个单元格的字符,以便CSV知道单元格(标记)的起始位置和结束位置。


7

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

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

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

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


3
看起来 Steve Siebert 的回答 是正确的。我建议你接受他的回答(点击大的空白复选标记),删除你自己的回答,同时将其内容移动到他的回答下面的评论中。 - Basil Bourque

2
我们在数据中包含引号并且输入内容没有引号时也会遇到这个错误。例如:
some cell|this "cell" caused issues|other data

虽然难以找到,但在 Apache 文档中有提到 withQuote() 方法可以将 null 作为值输入。

我们之前遇到了同样的错误信息,而这个方法 (谢天谢地) 最终解决了问题。


1
谢谢@Cuga。我们嵌入了引用并解析了数据。你的评论帮了我们很多。 - Anand

1
我遇到了这个问题,当我忘记在我的CSVFormat上调用.withNullString("")时。基本上,这个异常总是发生在以下情况下:
  • 你的引号符错误
  • 你的空字符串表示错误
  • 你的列分隔符字符错误
确保你知道你的格式的细节。此外,一些程序使用前导字节顺序标记(例如,Excel使用\uFEFF)来表示文件的编码。这也可能会让你的解析器出错。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接