【问题标题】:How to read csv with unknow column names and with unknow column count using in spring batch?如何在春季批处理中使用未知列名和未知列数读取csv?
【发布时间】:2020-02-21 10:02:01
【问题描述】:

我的步骤遵循了 FlatFileItemReader 配置:

@Bean
@StepScope
public FlatFileItemReader<RawInput> reader(FieldSetMapper<RawInput> fieldSetMapper, @Value("#{jobParameters['files.location']}") Resource resource) {
    var reader = new FlatFileItemReader<RawInput>();
    reader.setName("my-reader");
    reader.setResource(resource);
    var mapper = new DefaultLineMapper<RawInput>();
    mapper.setLineTokenizer(crmCsvLineTokenizer());
    mapper.setFieldSetMapper(fieldSetMapper);
    mapper.afterPropertiesSet();
    reader.setLineMapper(mapper);
    return reader;
}

RawInput 包含 1 个字段,因此它允许我使用单列读取 csv。现在要求是变化,现在我必须能够读取任何行数的任何 csv 文件,因此我需要以某种方式传递数组,而不是 RawInput。是否可以使用 FlatFileItemReader 或者我应该更改实现?

【问题讨论】:

标签: spring csv spring-batch inputstream reader


【解决方案1】:

有效:

    var reader = new FlatFileItemReader<List<String>>();
    reader.setName("reader");
    reader.setResource(resource);
    //line mapper
    var lineMapper = new DefaultLineMapper<List<String>>();        
    lineMapper.setLineTokenizer(new DelimitedLineTokenizer());
    lineMapper.setFieldSetMapper(myFieldSetMapper); // see implementation below
    lineMapper.afterPropertiesSet();

    reader.setLineMapper(lineMapper);
    return reader;


@Component
public class MyFieldSetMapper implements FieldSetMapper<List<String>> {

    @NonNull
    @Override
    public List<String> mapFieldSet(@NonNull FieldSet fieldSet) {
        return Arrays.stream(fieldSet.getValues())
                .map(StringUtils::lowerCase) // optional
                .map(StringUtils::trimToNull) // optional
                .collect(Collectors.toList());
    }
}

【讨论】:

    猜你喜欢
    • 2018-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-06
    • 2013-02-04
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多