我在使用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
)来表示文件的编码。这也可能使解析器出错。