Spring batch 如何使用spring批处理在每个列的分隔符之前添加空格?
当使用SpringBatch从db写入csv文件时,我需要根据每个列的分隔符之前的条件添加空格 例如,我需要csv文件中的间距Spring batch 如何使用spring批处理在每个列的分隔符之前添加空格?,spring-batch,Spring Batch,当使用SpringBatch从db写入csv文件时,我需要根据每个列的分隔符之前的条件添加空格 例如,我需要csv文件中的间距 Column1;Column2;Column3;Column4 AI22;FIENC234DK;EDEJJEDK;JEND4 OR2 ;JFJRN3D ;DEDERF3E;FEF EK3R;DJE3DJJEJE;JDJENEJ ;3NEN3 我已经显示了当前运行的代码块 @Bean ItemReader<CdVehicle> databaseToC
Column1;Column2;Column3;Column4
AI22;FIENC234DK;EDEJJEDK;JEND4
OR2 ;JFJRN3D ;DEDERF3E;FEF
EK3R;DJE3DJJEJE;JDJENEJ ;3NEN3
我已经显示了当前运行的代码块
@Bean
ItemReader<CdVehicle> databaseToCsvItemReader() {
JdbcCursorItemReader<CdVehicle> databaseReader = new JdbcCursorItemReader<>();
databaseReader.setDataSource(dataSource);
databaseReader.setSql(QUERY_FIND_FRIENDS);
databaseReader.setRowMapper(new BeanPropertyRowMapper<>(CdVehicle.class));
return databaseReader;
}
@Bean
ItemWriter<CdVehicle> databaseToCsvItemWriter() {
FlatFileItemWriter<CdVehicle> csvFileWriter = new FlatFileItemWriter<>();
String exportFileHeader = "CV20VEHID;CV20RFDPR;CV20USAGE;CV20CRVEH;CV20PERID;CV20SITE;CV27PROJ;CV27TYCAI;CV27PHASE;CV27MILLE;CV27CRV;O;CV20DTECL;CV20TEINT;CV20PRINCIPALE;CV20SECONDAIRE;CV20CRBIS;CV36TYPRX";
StringHeaderWriter headerWriter = new StringHeaderWriter(exportFileHeader);
csvFileWriter.setHeaderCallback(headerWriter);
String userhome = System.getProperty("user.home");
String exportFilePath = userhome + "/tmp/cdv.txt";
csvFileWriter.setResource(new FileSystemResource(exportFilePath));
LineAggregator<CdVehicle> lineAggregator = newPersonLineAggregator();
csvFileWriter.setLineAggregator(lineAggregator);
return csvFileWriter;
}
@Bean
public Step databaseToCsvStep() {
return stepBuilderFactory.get("databaseToCsvStep")
.<CdVehicle, CdVehicle>chunk(100)
.reader(databaseToCsvItemReader())
.writer(databaseToCsvItemWriter())
.build();
}
@Bean
Job databaseToCsvJob() {
return jobBuilderFactory.get("databaseToCsvJob")
.incrementer(new RunIdIncrementer())
.flow(databaseToCsvStep())
.end()
.build();
}
private LineAggregator<CdVehicle> newPersonLineAggregator() {
DelimitedLineAggregator<CdVehicle> lineAggregator = new DelimitedLineAggregator<>();
lineAggregator.setDelimiter(";");
FieldExtractor<CdVehicle> fieldExtractor = newPersonFieldExtractor();
lineAggregator.setFieldExtractor(fieldExtractor);
return lineAggregator;
}
private FieldExtractor<CdVehicle> newPersonFieldExtractor() {
BeanWrapperFieldExtractor<CdVehicle> extractor = new BeanWrapperFieldExtractor<>();
extractor.setNames(new String[] {"CV20VEHID","CV20RFDPR","CV20USAGE","CV20CRVEH","CV20DTAPP","CV20PERID","CV20SITE","CV27PROJ","CV27TYCAI","CV27PHASE","CV27MILLE","CV27CRV","CV27TYMOT","O","CV20DTECL","CV20TEINT","CV20PRINCIPALE", "CV20SECONDAIRE","CV20CRBIS","CV36TYPRX"});
return extractor;
}
为了实现间距,如何逐列检查柱的配合条件。是否有人知道如何在迭代过程中按列标题名称条件检查并在分隔符前留出空间。您可以使用Spring批处理来利用
字符串
语法。只需将现有的LineAggregator
实现替换为以下内容:
private LineAggregator newPersonLineAggregator(){
FormatterLineAggregator lineAggregator=新的FormatterLineAggregator();
lineAggregator.setFieldExtractor(newpersonfielextractor());
lineAggregator.setFormat(“%-4s;%-10s;%-8d;%-5s”);
回流管集热器;
您可能应该问,为什么在类似CSV的文件中需要某种固定宽度,这是不常见的,因为有分隔符;
无论如何……您是否考虑过使用FormatterLineAggregator
而不是DelimitedLineAggregator
?这更适合您的用例。
Column1;Column2;Column3;Column4
AI22;FIENC234DK;EDEJJEDK;JEND4
OR2;JFJRN3D;DEDERF3E;FEF
EK3R;DJE3DJJEJE;JDJENEJ;3NEN3