Весенняя партия 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;
}