【问题标题】:Invalid char between encapsulated token and delimiter in Apache Commons CSV libraryApache Commons CSV 库中封装的令牌和分隔符之间的字符无效
【发布时间】:2014-12-31 00:39:43
【问题描述】:

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

这个错误是什么意思?

【问题讨论】:

  • 如果 csv 文件第 2 行很长,能否具体显示它?
  • 这是示例行 2:"---","88104310D64DCG","10-20-2014","10:03 AM","10-20-2014","10 :03 AM","00:00:00"," "," ","172.21.128.74"," ","h323",256," ","OUTGOING",45,1,0," ", " ","user:---","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
  • 另一个观察结果是,如果我在 Microsoft Excel 工作簿中打开 CSV 文件,进行一些修改然后保存。现在运行可以工作的解析器程序!!
  • @SanthoshSridhar 请将这些附加信息整齐地放入问题中,而不是作为 cmets 发布。使用问题标签下方的“编辑”链接(如果在网络浏览器中)。

标签: java apache-commons apache-commons-csv


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      为避免上述问题,请按如下方式转义嵌套引号: “嵌套属性”“”“quote”“”“”

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

      【讨论】:

      • 看起来the Answer by Steve Siebert 是正确的。我建议你接受他的答案(点击大的空白复选标记),删除你自己的答案,同时将其文本移动到对他的答案的评论。
      【解决方案4】:

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

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

      很难找到,但在Apache's docs 中,他们提到了withQuote() 方法,该方法可以将null 作为值。

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

      【讨论】:

      • 谢谢@Cuga。我们嵌入了报价,并用数据解析。您的评论帮助了我们。
      【解决方案5】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多