java - 如何使用 Spring Boot 在 Spring Batch 中以不同顺序读取 csv 列
问题描述
我正在创建一个读取 csv 文件并存储在数据库中的 spring 批处理应用程序。
只有当我按顺序设置列名时,我才能读取它并将其存储在数据库中。
当我更改 csv 文件中的顺序时,它不起作用。
我的目标:
我的目标是即使列名不按顺序读取文件并存储在数据库中。
我的 CSV 文件如下所示:
id,name
1,xyz
以上订单按预期工作。但是如果像下面这样改变顺序,它就不起作用了。我该如何解决?
name,id
xyz,1
我的批量配置:
@Configuration
@EnableBatchProcessing
public class SpringBatchConfiguration {
@Bean
public Job job(JobBuilderFactory jobBuilderFactory,StepBuilderFactory stepBuilderFactory,
ItemReader<BatchProcessEntity> itemReader,ItemWriter<BatchProcessEntity> itemWriter,ItemProcessor<BatchProcessEntity,BatchProcessEntity> itemProcessor) {
Step step = stepBuilderFactory.get("Loading-file")
.<BatchProcessEntity,BatchProcessEntity>chunk(100)
.reader(itemReader)
.processor(itemProcessor)
.writer(itemWriter)
.build();
Job job=jobBuilderFactory.get("Csv")
.incrementer(new RunIdIncrementer())
.start(step).build();
return job;
}
@Bean
public FlatFileItemReader<BatchProcessEntity> flatFileItemReader(@Value("${input}") Resource resource) {
FlatFileItemReader<BatchProcessEntity> flatFileItemReader=new FlatFileItemReader<>();
flatFileItemReader.setResource(resource);
flatFileItemReader.setName("Loading Csv File");
flatFileItemReader.setLinesToSkip(1);
flatFileItemReader.setLineMapper(lineMapper());
return flatFileItemReader;
}
@Bean
public LineMapper<BatchProcessEntity> lineMapper() {
DefaultLineMapper<BatchProcessEntity> defLineMapper=new DefaultLineMapper<>();
DelimitedLineTokenizer delimitedLineTokenizer=new DelimitedLineTokenizer();
delimitedLineTokenizer.setDelimiter(",");
delimitedLineTokenizer.setStrict(true);
delimitedLineTokenizer.setNames(new String[] {"id","name"});
BeanWrapperFieldSetMapper<BatchProcessEntity> beanWrapperFieldSetMapper=new BeanWrapperFieldSetMapper<>();
beanWrapperFieldSetMapper.setTargetType(BatchProcessEntity.class);
defLineMapper.setLineTokenizer(delimitedLineTokenizer);
defLineMapper.setFieldSetMapper(beanWrapperFieldSetMapper);
return defLineMapper;
}
}
我的实体:
@Entity
@Table(name="springbatchprocess")
@Data
public class BatchProcessEntity {
@Id
Integer id;
@Column(name="name")
String eName;
@Column(name="address")
String eAddress;
@Column(name="salary")
String eSalary;
@Column(name="dept")
String eDept;
@Column(name="status")
Integer eStatus;
@Column(name="date")
Date date;
}
只有当我按照代码中定义的顺序设置列时,上面的代码才能正常工作。当我更改订单时,它不起作用?
我该如何解决?
解决方案
您需要编写一个自定义映射器来执行此操作。本教程中提供了一个示例:
https://www.baeldung.com/introduction-to-spring-batch
它会是这样的:
public class BatchProcessFieldSetMapper implements FieldSetMapper<BatchProcessEntity> {
public BatchProcessEntity mapFieldSet(FieldSet fieldSet) throws BindException {
BatchProcessEntity batchProcessEntity = new BatchProcessEntity();
batchProcessEntity.setEAddress(fieldSet.readString("address"));
//...etc
return batchProcessEntity;
}
}
推荐阅读
- javascript - 创建视图 - 通过存储过程传递参数和更新模型
- javascript - 无法为用于 XML http 请求的 onload 函数内的标记定义 onclick 事件
- c++ - 在 std::function 中捕获 lambda 会导致额外的副本
- amazon-web-services - 2 个 AWS Lightsail 实例当一个实例被更改时会发生什么
- github - 文件夹不会推送到 Github
- postgresql - Postgresql:带子句功能
- python - 在“R: Python: Html (self-contained) of notebook”中,可以合理地预期发件人的预期含义是什么
- list - Sass 返回“错误:("primary": #0075dd !important, ...) 不是有效的 CSS 值。” 动态创建新地图时
- python - facebook-业务 | 从 10->12 更新
- python - 如何将非数字列转换为数字?