Недопустимый 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 как значение.

Мы получили то же сообщение об ошибке, и это (к счастью) закончилось тем, что мы исправили проблему.