Недопустимый char между инкапсулированным токеном и разделителем в библиотеке CSV Apache Commons
Я получаю следующую ошибку при анализе файла CSV с помощью библиотеки Apache Commons 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)
В чем смысл этой ошибки?
Ответы
Ответ 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 файлов имеет атрибут следующим образом:
"с вложенной" цитатой "
Из-за вложенной цитаты в атрибуте сбой анализатора.
Чтобы избежать вышеупомянутой проблемы, избегайте вложенной цитаты следующим образом:
"с вложенной" "" цитатой" "" "
Это единственный способ решить проблему.
Ответ 4
Мы столкнулись с этим в этой же ошибке с данными, содержащими кавычки в противном случае без кавычек. То есть:.
some cell|this "cell" caused issues|other data
Трудно было найти, но в Apache docs они упоминают метод withQuote()
, который может принимать null
как значение.
Мы получили то же сообщение об ошибке, и это (к счастью) закончилось тем, что мы исправили проблему.