忽略使用Jackson CSV解析CSV文件的特定列

时间:2019-05-09 20:56:03

标签: jackson jackson-databind jackson-dataformat-csv

我的问题是我需要将具有任意列/顺序的CSV文件解析为已知域POJO(例如Person)。我可以确定需要处理的列,而忽略其余的列。

选项CsvParser.Feature.IGNORE_TRAILING_UNMAPPABLE”似乎正是我所需要的,但是我需要处理的列并不需要在CSV文件的开头进行分组,并且我不能强迫用户“重新排序” ”。他们的上载CSV文件的列。此外,有时我没有标题行,但是UI强制用户标识列并将此信息传递给

例如,我有以下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

我只需要6列中的4列(名字,姓氏,DOB,邮政编码),因为我的个人POJO仅包括以下字段:

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

我已经定义了一个为Person键入的CsvSchema,并按顺序指定了我感兴趣的列(名字,姓氏,IGNORE,DOB,IGNORE2,邮政编码),因为我想跳过列(昵称,职业) 。但是,在反序列化器中进行映射时,“ IGNORE”列将被忽略,最终我得到“ DOB”的“昵称”值,从而导致DOB字段的值无效。

2 个答案:

答案 0 :(得分:0)

请参阅提供的此链接

您应该能够解决此https://github.com/FasterXML/jackson-dataformat-csv/issues/82

答案 1 :(得分:0)

我的错误是按以下方式定义架构,这显然将架构与域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);