繁体   English   中英

如何使用spring boot在春季批处理中以不同顺序读取csv列

[英]how to read csv columns in different order in spring batch with spring boot

我正在创建一个弹簧批处理应用程序,该应用程序读取csv文件并存储在db中。

只有在按顺序设置列名时,我才能读取它并将其存储在db中。

当我更改csv文件中的顺序时,它不起作用。

我的目标:

我的目标是即使列名不按顺序读取文件并存储在db中。

我的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;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM