Univocity CSV анализатор склеивает всю строку, если она начинается с кавычки " - PullRequest
0 голосов
/ 06 ноября 2018

Я использую univocity 2.7.5 для анализа csv файла. До сих пор он работал нормально и анализировал строку в файле csv как массив String с элементами n, где n = количество столбцов в строке. Но теперь у меня есть файл, где строки начинаются с кавычки " и парсер не может с этим справиться. Он возвращает строку в виде массива String только с одним элементом, который содержит данные всей строки. Я пытался удалить эту цитату из файла csv, и она работала нормально, но там около 500 000 строк. Что я должен сделать, чтобы это работало?

Вот пример строки из моего файла (в исходном файле тоже есть кавычки) :

 "100926653937,Kasym Amina,620414400630,Marzhan Erbolova,""Kazakhstan, Almaty, 66, 3"",87029845662"

А вот и мой код:

    CsvParserSettings settings = new CsvParserSettings();
    settings.setDelimiterDetectionEnabled(true);
    CsvParser parser = new CsvParser(settings);
    List<String[]> rows = parser.parseAll(csvFile);

1 Ответ

0 голосов
/ 07 ноября 2018

Автор библиотеки здесь. На входе у вас есть правильно сформированный CSV, с одним значением, состоящим из:

100926653937,Kasym Amina,620414400630,Marzhan Erbolova,"Kazakhstan, Almaty, 66, 3",87029845662

Если эта строка появилась в середине вашего ввода, я предполагаю, что ваш ввод содержит неэкранированные кавычки (где-то до того, как вы добрались до этой строки). Попробуйте поиграть с настройкой обработки неэкранированных котировок:

Например, это может работать:

settings.setUnescapedQuoteHandling(UnescapedQuoteHandling.STOP_AT_CLOSING_QUOTE);

Если ничего не работает, и все ваши строки выглядят так, как вы опубликовали, то вы можете дважды проанализировать ввод (это дерьмово и медленно, но сработает):

CsvParser parser = new CsvParser(settings);
parser.beginParsing(csvFile);

List<String[]> out = new ArrayList<>();
String[] row;
while ((row = parser.parseNext()) != null) {
    //got a row with unexpected length?
    if(row.length == 1){
        //break it down again.
        row = parser.parseLine(row[0]);
    }
    out.add(row);
}

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

...