Jackson CSV Parser |处理无效值

时间:2017-09-12 16:53:14

标签: csv jackson-dataformat-csv

我正在尝试解析从上游出来的CSV文件。

CSV文件包含一些日期和编号字段,其格式是预先确定的。很少有实例,其中字段中的值不符合预期,我们希望将这些值读取为null,但Jackson-CSV解析器会抛出异常。

以下是我的例外

at com.fasterxml.jackson.databind.exc.InvalidFormatException.from(InvalidFormatException.java:67)     at com.fasterxml.jackson.databind.DeserializationContext.weirdStringException(DeserializationContext.java:1535)     at com.fasterxml.jackson.databind.DeserializationContext.handleWeirdStringValue(DeserializationContext.java:910)     在com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseDate(StdDeserializer.java:523)     在com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseDate(StdDeserializer.java:466)     at com.fasterxml.jackson.databind.deser.std.DateDeserializers $ DateBasedDeserializer._parseDate(DateDeserializers.java:195)     at com.fasterxml.jackson.databind.deser.std.DateDeserializers $ DateDeserializer.deserialize(DateDeserializers.java:285)     at com.fasterxml.jackson.databind.deser.std.DateDeserializers $ DateDeserializer.deserialize(DateDeserializers.java:268)     at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:127)     在com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:287)     在com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:151)     在com.fasterxml.jackson.databind.MappingIterator.nextValue(MappingIterator.java:277)

我也在Jackson CSVGithub页面上报告过相同的内容。 https://github.com/FasterXML/jackson-dataformat-csv/issues/153

1 个答案:

答案 0 :(得分:0)

您可以尝试univocity-parsers,因为它可以处理日期/数字字段中的多种格式。例如:

public class MyClass {
    @Format(formats = {"dd-MMM-yyyy", "yyyy-MM-dd"})
    @Parsed
    private Date date;

    @Format(formats = {"$###,###.###", ""#0.00""})
    @Parsed
    private BigDecimal amount;
}

现在,如果没有格式与给定输入的内容兼容,您可以使用以下方法处理错误:

CsvParserSettings settings = new CsvParserSettings();
settings.detectFormatAutomatically(); //no need to configure format or anything.

parserSettings.setProcessorErrorHandler(new RetryableErrorHandler<ParsingContext>() {
    @Override
    public void handleError(DataProcessingException error, Object[] inputRow, ParsingContext context) {
        if(error.getColumnName().equals("date")){ 
            //if there's an error in the date column, assign a default and proceed with the record.
            setDefaultValue(new Date());
        } else { 
            //else keep the record anyway. Null will be used instead of the value you can't process.
            keepRecord(); //if you don't call keepRecord() the entire row is discarded.
        }
    }
});

最后,您可以使用以下方法解析输入:

List<MyClass> myClassList = new CsvRoutines(parserSettings).parseAll(MyClass.class, input);

希望它有所帮助。

免责声明:我是这个图书馆的作者。它是开源和免费的(Apache 2.0许可证)