Общий форматировщик CSV в Apache: IOException: недопустимый символ между инкапсулированным токеном и разделителем - PullRequest
0 голосов
/ 19 мая 2018

Я пытаюсь проанализировать файл CSV с помощью JakartaCommons-csv

Пример входного файла

Field1,Field2,Field3,Field4,Field5
"Ryan, R"u"bianes","  dummy@gmail.com","29445","626","South delhi, Rohini 122001"

Форматер : CSVFormat.newFormat(','). withIgnoreEmptyLines (). withQuote ('"') CSV_DELIMITER is,

Выход

  1. Значение Field1 после анализа CSV должно быть: Ryan, R "u" bianes
  2. Значение Field5 после разбора CSV должно быть: Южный Дели, Rohini 122001

Исключение: Причина: java.io.IOException: (строка 2) неверный символ между инкапсулированным токеном и разделителем

Ответы [ 2 ]

0 голосов
/ 19 мая 2018

Проблема в том, что кавычки не экранированы должным образом.Ваш парсер не справится с этим.Попробуйте univocity-parsers , поскольку это единственный синтаксический анализатор для Java, который я знаю, который может обрабатывать неэкранированные кавычки внутри значения в кавычках.Это также в 4 раза быстрее, чем Commons CSV.Попробуйте этот код:

    //configure the parser to handle your situation
    CsvParserSettings settings = new CsvParserSettings();
    settings.setHeaderExtractionEnabled(true); //uses first line as headers
    settings.setUnescapedQuoteHandling(STOP_AT_CLOSING_QUOTE);
    settings.trimQuotedValues(true); //trim whitespace around values in quotes

    //create the parser
    CsvParser parser = new CsvParser(settings);

    String input = "" +
            "Field1,Field2,Field3,Field4,Field5\n" +
            "\"Ryan, R\"u\"bianes\",\"  dummy@gmail.com\",\"29445\",\"626\",\"South delhi, Rohini 122001\"";

    //parse your input
    List<String[]> rows = parser.parseAll(new StringReader(input));

    //print the parsed values
    for(String[] row : rows){
        for(String value : row){
            System.out.println('[' + value + ']');
        }
        System.out.println("-----");
    }

Это напечатает:

[Ryan, R"u"bianes]
[dummy@gmail.com]
[29445]
[626]
[South delhi, Rohini 122001]
-----

Надеюсь, это поможет.

Раскрытие информации: я являюсь автором этой библиотеки, это с открытым исходным кодоми бесплатно (лицензия Apache 2.0)

0 голосов
/ 19 мая 2018

Проблема в том, что ваш файл не соответствует общепринятому стандарту цитирования в файлах CSV.Правильный способ представления кавычки в строке в кавычках - это повторение кавычки.Например.

Field1,Field2,Field3,Field4,Field5
"Ryan, R""u""bianes","  dummy@gmail.com","29445","626","South delhi, Rohini 122001"

Если вы ограничиваетесь стандартной формой цитирования CSV, CSV-парсер Apache Commons должен работать.

К сожалению, невозможно создать согласованный анализатор дляваш вариант формата, потому что нет никакой возможности устранить неоднозначность встроенной запятой и разделителя полей, если вам нужно представить поле, содержащее «Ryan R","baines».

Правила цитирования в файлах CSV изложены в различных местах, включая RFC 4180 .

...