Весенняя партия FlatfileitemReader для чтения искаженных строк

В моем проекте я использую пакет 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"

1 ответ

У меня была похожая проблема при чтении искаженных строк с FlatFileItemReader. В этом случае вы можете использовать DefaultRecordSeparatorPolicy в качестве RecordSeparatorPolicy в FlatFileItemReader. Что он делает, так это проверяет endOfRecord после чтения строки. Если в строке чтения есть кавычки без комментариев, она читает другую строку для нормализации ввода. Вы также можете переопределить поведение.

flatFileItemReader.setRecordSeparatorPolicy(new DefaultRecordSeparatorPolicy());

Обратитесь к DefaultRecordSeparatorPolicy API Doc для получения дополнительной информации

@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;
}
Другие вопросы по тегам