Игнорировать определенные столбцы при анализе файла CSV с помощью Jackson CSV - PullRequest
1 голос
/ 09 мая 2019

Моя проблема заключается в том, что мне нужно проанализировать файлы CSV с произвольными столбцами / порядком в известном домене POJO (скажем, Person). Я могу определить, какие столбцы мне нужно обработать, игнорируя остальные.

Опция CsvParser.Feature.IGNORE_TRAILING_UNMAPPABLE "показалась мне именно тем, что мне нужно, но столбцы, которые мне нужно обработать, необязательно сгруппированы в начале файла CSV, и я не могу заставить пользователя" переупорядочить "столбцы их загруженных файлов CSV. Кроме того, иногда я не получаю строку заголовка, но пользовательский интерфейс вынуждает пользователя идентифицировать столбцы и передает эту информацию.

Например, у меня есть следующий файл CSV:

First Name,Last Name,Nickname,DOB,Occupation,Postal Code
Freddy,Benson,Ruprecht,08/14/45,Con Artist,76701
Lawrence,Jamieson,Prince,03/14/33,Con Artist,5201
Janet,Colgate,Jackal,03/13/55,Con Artist,90401

Мне нужны только 4 из 6 столбцов (Имя, Фамилия, DOB, Почтовый индекс), так как мой POJO для Персона включает только эти поля:

public class Person {
    private String firstName;
    private String lastName;
    private LocalDate dob;
    private String postalCode;
}

Я определил CsvSchema, набранную для Person, и указал интересующие меня столбцы в порядке (Имя, Фамилия, IGNORE, DOB, IGNORE2, Почтовый код), так как я хотел бы пропустить столбцы (Nickname, Occupation) , Однако столбцы «IGNORE» игнорируются при отображении в десериализаторе, и в итоге я получаю значения «Nickname» для «DOB», что приводит к недопустимым значениям для поля DOB.

Ответы [ 2 ]

0 голосов
/ 10 мая 2019

Моя ошибка заключалась в определении схемы следующим образом, которая, очевидно, сильно связывает схему с доменом POJO:

CsvSchema schema = mapper
    .typedSchemaFor(Person.class)
    .withSkipFirstDataRow(hasHeader)
    .sortedBy(columnOrder.toArray(new String[columnOrder.size()]));

Решено путем определения схемы / столбцов следующим образом, что, кажется, беспорядочно связывает схему с доменом POJO:

CsvSchema schema = CsvSchema.builder()
    .addColumn("firstName")
    .addColumn("lastName")
    .addColumn("ignore1")
    .addColumn("dob")
    .addColumn("ignore2")
    .addColumn("postalCode")
    .build();

    CsvMapper mapper = new CsvMapper();
    MappingIterator<Person> personIter = mapper
            .readerFor(Person.class)
            .with(schema)
            .readValues(csvFile);
0 голосов
/ 10 мая 2019

Пожалуйста, обратитесь к этой ссылке при условии

Вы должны быть в состоянии решить эту проблему https://github.com/FasterXML/jackson-dataformat-csv/issues/82

...