当前位置: 首页 > 知识库问答 >
问题:

如何使用spring Batch为每个列在分隔符前添加空格?

苏高远
2023-03-14

当使用spring Batch从db写入csv文件时,我需要在每个列的分隔符之前根据条件添加空格。

例如,我在csv文件中要求间隔

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;
}
    Column1;Column2;Column3;Column4
    AI22;FIENC234DK;EDEJJEDK;JEND4
    OR2;JFJRN3D;DEDERF3E;FEF
    EK3R;DJE3DJJEJE;JDJENEJ;3NEN3

共有1个答案

何禄
2023-03-14

您可以通过使用Spring批处理FormatterLineAggregator来利用String格式化程序语法。只需将现有的LineAggregator实现替换为以下内容:

java prettyprint-override">private LineAggregator<CdVehicle> newPersonLineAggregator() {
    FormatterLineAggregator<CdVehicle> lineAggregator = new FormatterLineAggregator<>();
    lineAggregator.setFieldExtractor(newPersonFieldExtractor());
    lineAggregator.setFormat("%-4s;%-10s;%-8d;%-5s");
    return lineAggregator;

 类似资料:
  • 问题内容: 我有一个包含二进制数字的字符串。如何将其分成几对数字? 假设字符串是: 我想在每2个字符后添加一个分隔符,例如“:”(即冒号)。 我希望输出为: 我怎么能在Swift中做到这一点? 问题答案: Swift 5.1•Xcode 11或更高版本 测试中

  • 我需要在RecyclerView的每个网格之间添加一个分隔器。 请帮帮我.

  • 在这种情况下,是否可以定义边距和/或直接在列表项的布局中添加自定义分隔视图,或者是否有更好的方法来实现我的目标?

  • 我有一个包含许多列的表,我希望为每个列添加前缀。 我尝试了以下查询:

  • 问题内容: 我想为每个列名添加后缀,如下所示: 我该怎么做呢?另外,如果要添加后缀,解决方案将如何更改? 问题答案: 您可以使用一种理解: 也有内置方法,如和在另一个答案中提到的。

  • 我正在为Prestashop编写一个模块,该模块覆盖AdminProductsController,并向BackOffice产品视图中的批量操作菜单中添加另外两个操作。这是我在重写类的构造中添加批量操作的代码 结果是这样的 我想在“删除选定项”和“导出选定项”之间添加分隔符。我的意思是,在我新添加的条目之前添加它。我怎样才能做到这一点?