#java #spring-batch
Вопрос:
Я хочу взять данные из файла txt и отправить их в файл csv. каким должен быть код в весеннем пакете. ниже приведен упомянутый код как для читателя, так и для писателя. пожалуйста, помогите . Я могу передавать csv в csv в весенней партии. каков точный код в читателе предметов.
public class RecordsReader { @Bean public FlatFileItemReaderlt;Recordsgt; reader() { FlatFileItemReaderlt;Recordsgt; reader = new FlatFileItemReaderlt;gt;(); reader.setResource(new FileSystemResource("C://output/pip-1.7.txt")); reader.setLineMapper(getLineMapper()); reader.setLinesToSkip(1); return reader; } private LineMapperlt;Recordsgt; getLineMapper() { DefaultLineMapperlt;Recordsgt; lineMapper = new DefaultLineMapperlt;gt;(); DelimitedLineTokenizer lineTokenizer = new DelimitedLineTokenizer(); lineTokenizer.setNames(Records.fields()); BeanWrapperFieldSetMapperlt;Recordsgt; fieldSetter = new BeanWrapperFieldSetMapperlt;gt;(); fieldSetter.setTargetType(Records.class); lineMapper.setLineTokenizer(lineTokenizer); lineMapper.setFieldSetMapper(fieldSetter); return lineMapper; } }
Комментарии:
1. Так в чем же ваша проблема? Есть какие-нибудь исключения, которые вы видите?
Ответ №1:
Ваш компоновщик будет выглядеть так —
public class RecordsLineMapper implements LineMapperlt;Recordsgt; { private static final Pattern PATTERN = Pattern.compile( "^(?lt;recordIdgt;[a-zA-Z0-9-]{0,20})" "(?lt;value1gt;[a-zA-Z0-9-]{0,50})" "$"); @Override @NonNull public Records mapLine(@NonNull String line, int lineNumber) { // Match the Line Matcher matcher = PATTERN.matcher(line); if (!matcher.matches()) { throw new IllegalArgumentException("Line at " lineNumber " does not match pattern"); } Records records = new Records(); records.setRecordId(matcher.group("recordId")); records.setValue1(matcher.group("value1")); return records; } }
Компонент FlatFileItemReader выглядит следующим образом —
@Bean @StepScope public FlatFileItemReaderlt;Recordsgt; recordsFlatFileItemReader( RecordsLineMapper mapper) { return new FlatFileItemReaderBuilderlt;Recordsgt;() .name("records-reader") .lineMapper(mapper) .build(); }
Теперь вы можете проверить запись в процессоре и добавить в нее запись.
Реализация Писателя
@Bean @StepScope public FlatFileItemWriterlt;Recordsgt; recordsToCsvFileItemWriter( @Qualifier("csvFile") File csvFile, RecordsLineAggregator aggregator) { return new FlatFileItemWriterBuilderlt;Recordsgt;() .name("records-to-csv-item-writer") .saveState(false) .resource(new FileSystemResource(csvFile)) .lineAggregator(aggregator) .build(); } public class RecordsLineAggregator implements LineAggregatorlt;Recordsgt; { @Override @NonNull public String aggregate(Records item) { return new StringJoiner(",") .add(item.getRecordId()) .add(item.getValue1()) .toString(); } }
Комментарии:
1. извините, я не понял
2. как мне отредактировать свой код для чтения элементов.
3. Аналогичным образом я создал компонент reader и предоставил компоновщик.