【问题标题】:Java Jackson CSV: Empty Header fieldJava Jackson CSV:空标题字段
【发布时间】:2019-02-19 01:32:52
【问题描述】:

我正在尝试将大型 csv 文件映射到带有 jackson csv 的类。该 csv 文件根本没有被规范化,这会导致几个问题。

为了给你一个印象,我创建了一个有代表性的文件:

,B,C,D,E,F�F,G,H H,I (I)
0,AAA,20. Jan.,10,A,5,AA: AAAA,1,A�AAA
1,BBB,05-Dez-14,12,BBB,1,BB: BBBB,32,BBB
2,CCCC,28. Jun.,80,CCCC,2,CCCC: CCCC,1,CCC / CCC

第一行代表标题,第一列代表id。 Jackson CsvMapper 无法映射第一列,因为它是空名称。

CsvMapper mapper = new CsvMapper();
CsvSchema bootstrapSchema = CsvSchema.builder()
                .setColumnSeparator(',')
                .setUseHeader(true)
                .setStrictHeaders(true)
                .setSkipFirstDataRow(true)
                .addColumn("", CsvSchema.ColumnType.NUMBER)
                .addColumn("B", CsvSchema.ColumnType.STRING)
                .addColumn("C", CsvSchema.ColumnType.STRING)
                .addColumn("D", CsvSchema.ColumnType.NUMBER)
                .addColumn("E", CsvSchema.ColumnType.STRING)
                .addColumn("F�F", CsvSchema.ColumnType.NUMBER)
                .addColumn("G", CsvSchema.ColumnType.STRING)
                .addColumn("H H", CsvSchema.ColumnType.NUMBER)
                .addColumn("I (I)", CsvSchema.ColumnType.STRING)
                .build();

        //File file = new ClassPathResource(fileName).getFile();
        MappingIterator<POJO> readValues =
                mapper.reader(POJO.class).with(bootstrapSchema).readValues(file);

        while (readValues.hasNext()){
            logger.info(mapper.writeValueAsString(readValues.nextValue()));
        }

还有 POJO 类:

@JsonPropertyOrder({"","B","C","D","E","F�F", "G","H H","I (I)"})
public class POJO {

@JsonProperty
private Integer id;

@JsonProperty("B")
private String b;

@JsonProperty("C")
private String c;

@JsonProperty("D")
private Integer d;

@JsonProperty("E")
private String e;

@JsonProperty("F�F")
private Integer f;

@JsonProperty("G")
private String g;

@JsonProperty("HH")
private Integer h;

@JsonProperty("I (I)")
private String i;
}

那么,如何正确映射这个混乱?

提前致谢

【问题讨论】:

  • 你能发布你的代码吗?
  • 我编辑了重要的代码sn-ps。

标签: java csv jackson


【解决方案1】:

尝试像这样更改您的CsvMapper

List<Object> objList = new CsvMapper()
                       .enable(CsvParser.Feature.SKIP_EMPTY_LINES)
                       .enable(CsvParser.Feature.TRIM_SPACES)
                       .enable(CsvParser.Feature.WRAP_AS_ARRAY)
                       .enable(CsvParser.Feature.INSERT_NULLS_FOR_MISSING_COLUMNS)
                       .readerFor(Map.class)
                       .with(CsvSchema.emptySchema().withHeader())
                       .readValues(file)
                       .readAll();

【讨论】:

  • 还不行:com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field ""
  • 尝试读取值时仍然出现相同的异常。看起来问题出在我的 POJO 中的注释上:第一列映射如下:@JsonProperty("") private Integer id;该列在 csv 中映射为空标题,但它尝试将其映射为“id”而不是“”。
  • 我遇到了同样的问题。我通过将我的字段从私有更改为公共来解决它
猜你喜欢
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 2016-07-06
  • 1970-01-01
  • 1970-01-01
  • 2018-05-31
  • 2012-07-04
  • 1970-01-01
相关资源
最近更新 更多