Неверный символ между инкапсулированным токеном и разделителем в библиотеке 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) для обозначения кодировки файла. Это также может вызвать сбой в работе парсера.

Другие вопросы по тегам