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

Java Apache Commons CSV库中封装的令牌和分隔符之间的字符无效,java,apache-commons,apache-commons-csv,Java,Apache Commons,Apache Commons Csv,我在使用库解析CSV文件时遇到以下错误 此错误的含义是什么?CSV文件中的这一行包含一个无效字符,该字符位于您的一个单元格与行尾、文件结尾或下一个单元格之间。造成这种情况的一个常见原因是未能转义封装字符(用于“包装”每个单元格的字符,以便CSV知道单元格(标记)的开始和结束位置。我找到了问题的解决方案。 我的一个CSV文件具有如下属性: “属性,带有嵌套的“引号” 由于属性中嵌套了引号,解析器失败 为避免上述问题,请按如下方式转义嵌套引号: 具有嵌套的“”引号“”的属性 这是解决此问题的一种方法

我在使用库解析CSV文件时遇到以下错误


此错误的含义是什么?

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

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

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

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


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

我们在相同的错误中遇到了此问题,数据中包含引号,否则输入不带引号。例如:

some cell|this "cell" caused issues|other data
很难找到,但在中,他们提到了
withQuote()
方法,该方法可以将
null
作为一个值


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

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

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();
}

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

  • 您的报价符号错误
  • 您的空字符串表示法错误
  • 您的列分隔符char错误

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

如果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”、“传出”、“45,1,0”、“用户:--”、“172.21.128.74”、“”、“”、“172.21.128.74”、“尝试失败”、“呼叫已结束”、“正在转接”,16,0,0.0,0.0,0.0,0.0,0.0,0.0,0,0,0.0,0,0还有一点要注意的是,如果我在Microsoft Excel工作簿中打开CSV文件,进行一些修改,然后保存它。现在运行有效的解析器程序!!@Santhoshridhar请将附加信息整齐地放入问题中,而不是作为注释发布。使用“编辑”您的问题标签下方的链接(如果在web浏览器中)。看起来是正确的。我建议您接受他的答案(单击大空复选标记),删除您自己的答案,同时将其文本移动到对其答案的评论中。谢谢@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]]