2

我正在尝试解析从上游提供的 CSV 文件。

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

以下是我的例外

在 com.fasterxml.jackson.databind.exc.InvalidFormatException.from(InvalidFormatException.java:67) 在 com.fasterxml.jackson.databind.DeserializationContext.weirdStringException(DeserializationContext.java:1535) 在 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) 在 com.fasterxml.jackson.databind.deser.std.DateDeserializers$DateBasedDeserializer._parseDate(DateDeserializers.java:195) 在 com.fasterxml.jackson.databind.deser.std.DateDeserializers$DateDeserializer.deserialize(DateDeserializers .java:285)在 com.fasterxml.jackson.databind.deser.std。DateDeserializers$DateDeserializer.deserialize(DateDeserializers.java:268) at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:127) at 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.databind.MappingIterator.nextValue(MappingIterator.java:277)jackson.databind.MappingIterator.nextValue(MappingIterator.java:277)

我也在 Jackson CSVGithub 页面上报告了同样的情况。 https://github.com/FasterXML/jackson-dataformat-csv/issues/153

4

1 回答 1

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 许可证)

于 2017-09-13T04:24:39.650 回答