Парсер Jackson CSV дросселирует файлы значений, разделенные запятыми, если "," находится в поле, даже если цитируется с " - PullRequest
0 голосов
/ 08 сентября 2018

код:

package org.javautil.salesdata;
import java.io.File;
import java.io.IOException;
import java.util.Map;

import org.javautil.util.ListOfNameValue;

import com.fasterxml.jackson.databind.MappingIterator;
import com.fasterxml.jackson.dataformat.csv.CsvMapper;
import com.fasterxml.jackson.dataformat.csv.CsvSchema;

// https://github.com/FasterXML/jackson-dataformats-text/tree/master/csv
public class Manufacturers {
    private static final String fileName= "src/main/resources/pdssr/manufacturers.csv";

    ListOfNameValue getManufacturers() throws IOException {
        ListOfNameValue lnv = new ListOfNameValue();
        File csvFile = new File(fileName);
        CsvMapper mapper = new CsvMapper();

        CsvSchema schema = CsvSchema.emptySchema().withHeader(); // use first row as header; otherwise defaults are fine
        MappingIterator<Map<String,String>> it = mapper.readerFor(Map.class)
           .with(schema)
           .readValues(csvFile);
        while (it.hasNext()) {
          Map<String,String> rowAsMap = it.next();
          System.out.println(rowAsMap);
        }

        return lnv;

    }

}

Данные:

"mfr_id","mfr_cd","mfr_name"
"0000000020","F-L", "Frito-Lay"
"0000000030","GM", "General Mills"
"0000000040","HVEND", "Hershey Vending"
"0000000050","HFUND", "Hershey Fund Raising"
"0000000055","HCONC", "Hershey Concession"
"0000000060","SNYDERS", "Snyder's of Hanover"
"0000000080","KELLOGG", "Kellogg & Keebler"
"0000000115","KARS", "Kar Nut Product (Kar's)"
"0000000135","MARS", "Mars Chocolate "
"0000000145","POORE", "Inventure Group (Poore Brothers)"
"0000000150","WOW", "WOW Foods"
"0000000160","CADBURY", "Cadbury Adam USA, LLC"
"0000000170","MONOGRAM", "Monogram Food"
"0000000185","JUSTBORN", "Just Born"
"0000000190","HOSTESS", "Hostess, Dolly Madison"
"0000000210","SARALEE", "Sara Lee"

Исключение составляет

fastxml.jackson.databind.exc.RuntimeJsonMappingException: слишком много записей: ожидается максимум 3 (значение № 3 (4 знака) "LLC" ")

Я думал, что выброшу свой собственный анализатор CSV и приму поддерживаемый проект с большей функциональностью, но большинство из них гораздо медленнее, просто ломаются или имеют примеры по всему Интернету, которые не работают с текущим выпуском продукт.

Ответы [ 2 ]

0 голосов
/ 09 сентября 2018

анализаторы univocity могут справиться с этим без каких-либо проблем. Он создан для работы со всеми типами хитрых и нестандартных файлов CSV, а также работает быстрее, чем используемый вами анализатор.

Попробуйте этот код:

    String fileName= "src/main/resources/pdssr/manufacturers.csv";
    CsvParserSettings settings = new CsvParserSettings();
    settings.setHeaderExtractionEnabled(true);

    CsvParser parser = new CsvParser(settings);
    for(Record record : parser.iterateRecords(new File(fileName))){
        Map<String, String> rowAsMap = record.toFieldMap();
        System.out.println(rowAsMap);
    }

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

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

0 голосов
/ 09 сентября 2018

Проблема в том, что ваш файл не соответствует стандарту CSV. Третье поле всегда начинается с пробела

mfr_id","mfr_cd","mfr_name"
"0000000020","F-L", "Frito-Lay"
"0000000030","GM", "General Mills"
"0000000040","HVEND", "Hershey Vending"
"0000000050","HFUND", "Hershey Fund Raising"

Из Википедия :

Согласно RFC 4180, spaces outside quotes in a field are not allowed; однако RFC также говорит, что «пробелы считаются частью поля и не должны игнорироваться». и «Разработчики должны« быть осторожными в том, что вы делаете, быть либеральными в том, что вы принимаете от других »(RFC 793, раздел 2.10) при обработке файлов CSV.»

Джексон "либерален" в обработке большинства ваших записей; но когда он находит

"0000000160","CADBURY", "Cadbury Adam USA, LLC"

У него нет другого выбора, кроме как рассматривать как 4 поля:

  • 0000000160 '
  • 'CADBURY'
  • '' Cadbury Adam USA '
  • 'ООО "'

Было бы предложено исправить файл, так как это позволит анализировать большинство библиотек CSV. Вы можете попробовать другую библиотеку, в ней нет недостатка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...