Как читать csv с неизвестными именами столбцов и с неизвестным количеством столбцов, используя весенний пакет?

У меня есть следующая конфигурация 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 или, может быть, мне следует изменить реализацию?


person gstackoverflow    schedule 21.02.2020    source источник
comment
Отвечает ли это на ваш вопрос? Spring Batch - возможно ли иметь динамический столбец в FlatFileReader?   -  person Mahmoud Ben Hassine    schedule 24.02.2020


Ответы (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());
    }
}
person gstackoverflow    schedule 26.02.2020