2017-09-12 1 views
1

Ich versuche, eine CSV-Datei zu analysieren, die von Upstream feed ist.Jackson CSV Parser | Handle ungültige Werte

Die CSV-Datei enthält einige Datum und Anzahl Felder, für das Format vor entschieden ist. Es gibt wenige Fälle, in denen der Wert im Feld nicht wie erwartet ist. Wir möchten diese Werte als null lesen, aber der Jackson-CSV-Parser löst die Ausnahme aus.

Unten ist mein Excecption

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

Ich habe das gleiche auch auf der Jackson CSVGithub Seite berichtet. https://github.com/FasterXML/jackson-dataformat-csv/issues/153

Antwort

0

Sie könnten univocity-parsers ausprobieren, da es mehrere Formate in Ihren Datums-/Zahlenfeldern verarbeiten kann. Zum Beispiel:

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

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

Nun, wenn keine Formate mit kompatibel sind, was für einen geben Eingang kommt, können Sie den Fehler mit diesem Griff:

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. 
     } 
    } 
}); 

Schließlich können Sie Ihre Eingabe mit diesem analysieren:

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

Ich hoffe, es hilft.

Haftungsausschluss: Ich bin der Autor dieser Bibliothek. Es ist Open-Source und kostenlos (Apache 2.0 Lizenz)

+0

Viele Jeronimo, aber ich habe Einschränkung Jackson verwendet nur. Jackson Guy empfohlen, einen Custom De-Serializer zu verwenden. – Pramod

Verwandte Themen