2017-09-12 6 views
1

업스트림에서 제공되는 CSV 파일을 구문 분석하려고합니다.Jackson CSV 파서 | 잘못된 값 처리

CSV 파일에는 형식이 미리 결정된 날짜 및 숫자 필드가 있습니다. 필드의 값이 예상과 같지 않은 경우가 거의 없으므로 값을 null로 읽으려고하지만 Jackson-CSV 파서가 예외를 throw합니다. 다음은

는 com.fasterxml.jackson.databind.DeserializationContext.weirdStringException에서 com.fasterxml.jackson.databind.exc.InvalidFormatException.from (InvalidFormatException.java:67) (DeserializationContext.java에서 내 Excecption

입니다 : 1535) com.fasterxml.jackson.databind.DeserializationContext.handleWeirdStringValue (DeserializationContext.java:910에서 ) com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseDate (StdDeserializer.java:523) 에서 닷컴에서 .fasterxml.jackson.databind.deser.std.StdDeserializer._parseDate (StdDeserializer.java:466) at com.fasterxml.jackson.databind.deser.std.DateDes 에일 리 어스 $ DateBasedDeserializer._parseDate (DateDeserializers.java:195) 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) (com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet (MethodProperty.java:127) , com.fasterxml.jackson.databind.deser). com.fasterxml.jackson.databind.MappingIterator.nextValue (MappingIterator.java에서 com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize (BeanDeserializer.java:151) 에서 BeanDeserializer.vanillaDeserialize (BeanDeserializer.java:287) : 277)

잭슨 CSVGithub 페이지에서도 동일한 내용을보고했습니다. https://github.com/FasterXML/jackson-dataformat-csv/issues/153

답변

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 라이센스)

+0

감사합니다. Jeronimo, 에 감사하지만 잭슨 만 사용하는 데 한계가 있습니다. Jackson Guy는 맞춤식 비 직렬기를 사용하도록 권장했습니다. – Pramod