簡體   English   中英

Spring批處理FlatfileitemReader讀取格式錯誤的行

[英]Spring batch FlatfileitemReader to read malformed lines

在我的項目中,我正在使用Spring批處理,並使用FlatFileItemReader / FieldSetMapper讀取文件。 某些輸入文件有問題。行被剪切/格式錯誤,記錄很少。
假設輸入文件有4列。 幾列格式不正確。 誰能幫我解決這個問題?(如果需要,我可以解釋更多)
FILE.CSV

"id","name","age","salary"
"1","user1","28","1000"
"2","user2","27","2000"
"3","user3","26
    ","3000"
"4","user4","25","
    4000"
"5","
        user5","24","5000"
"6","user6","23","6000"
"7","user7","22","7000"
"8","user8","21","8000"

在使用FlatFileItemReader讀取格式錯誤的行時,我遇到了類似的問題。 在這種情況下,可以將DefaultRecordSeparatorPolicy用作FlatFileItemReader中的RecordSeparatorPolicy。 它的作用是在讀取一行后檢查endOfRecord。 如果讀取的行中有任何未注釋的引號,它將讀取另一行以規范化輸入。 您還可以覆蓋行為。

flatFileItemReader.setRecordSeparatorPolicy(new DefaultRecordSeparatorPolicy());

有關更多信息,請參考DefaultRecordSeparatorPolicy API文檔

@Bean
public FlatFileItemReader<YourClassName> itemReader(@Value("${input}") Resource resource) {
    FlatFileItemReader<YourClassName> flatFileItemReader = new FlatFileItemReader<>();
    flatFileItemReader.setResource(resource);
    flatFileItemReader.setName("CSV-Reader");
    flatFileItemReader.setLinesToSkip(1);
    // override default comment '#' from file parsing
    flatFileItemReader.setComments(new String[] {});
    // checks for multi-line csv inputs for very lage row
    flatFileItemReader.setRecordSeparatorPolicy(new DefaultRecordSeparatorPolicy());
    flatFileItemReader.setLineMapper(lineMapper());
    return flatFileItemReader;
}

@Bean
public LineMapper<YourClassName> lineMapper() {
    DelimitedLineTokenizer lineTokenizer = new DelimitedLineTokenizer();
    lineTokenizer.setDelimiter(DelimitedLineTokenizer.DELIMITER_COMMA);
    lineTokenizer.setQuoteCharacter(DelimitedLineTokenizer.DEFAULT_QUOTE_CHARACTER);
    lineTokenizer.setStrict(false);
    lineTokenizer.setNames(COLUMN_NAMES);

    BeanWrapperFieldSetMapper<YourClassName> fieldSetMapper = new BeanWrapperFieldSetMapper<>();
    fieldSetMapper.setTargetType(YourClassName.class);

    DefaultLineMapper<YourClassName> defaultLineMapper = new DefaultLineMapper<>();
    defaultLineMapper.setLineTokenizer(lineTokenizer);
    defaultLineMapper.setFieldSetMapper(fieldSetMapper);
    return defaultLineMapper;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM