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