首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring Batch -在FlatFileReader中可以有一个动态列吗?

Spring Batch -在FlatFileReader中可以有一个动态列吗?
EN

Stack Overflow用户
提问于 2016-11-30 02:38:08
回答 2查看 3.4K关注 0票数 5

我正在处理许多没有固定标题/列的CSV文件,我说我可以得到10列的file1.csv和50列的file2.csv。

我不能提前知道我将拥有的列数,我不能为每种文件类型创建特定的作业,我的输入将是一个黑盒:一串CSV,它将具有从10到无限的X列数。

由于我想使用Spring Batch自动导入这些CSV,我想知道这是否可能?我知道我必须获取固定数量的列,因为处理器,以及在将数据发送回编写器之前,我需要将数据序列化为POJO。

我的处理器可以序列化一个数组吗?除了发送一个简单的对象之外,我是否可以获得一个对象数组,并且在我的工作结束时,我将拥有一个对象数组的数组?

你认为如何?

谢谢

EN

回答 2

Stack Overflow用户

发布于 2016-11-30 03:05:20

创建您自己的LineTokenizer实现。DelimitedLineTokenizer需要预定义的列数。如果你创建自己的,你可以像你想要的那样动态。您可以在此处的文档中阅读有关LineTokenizer的更多信息:http://docs.spring.io/spring-batch/apidocs/org/springframework/batch/item/file/transform/LineTokenizer.html

票数 4
EN

Stack Overflow用户

发布于 2019-11-15 19:17:40

我带着同样的问题来到了这个老帖子。最后,我在skippedLinesCallback的帮助下成功地构建了一个动态列FlatFileItemReader,所以我就把它留在这里:

代码语言:javascript
复制
@Bean
public FlatFileItemReader<Person> reader() {

    DefaultLineMapper<Person> lineMapper = new DefaultLineMapper<>();
    DelimitedLineTokenizer delimitedLineTokenizer = new DelimitedLineTokenizer();
    lineMapper.setLineTokenizer(delimitedLineTokenizer);
    lineMapper.setFieldSetMapper(new BeanWrapperFieldSetMapper<>() {
        {
            setTargetType(Person.class);
        }
    });

    return new FlatFileItemReaderBuilder<Person>()
            .name("personItemReader")
            .resource(new FileSystemResource(inputFile))
            .linesToSkip(1)
            .skippedLinesCallback(line -> delimitedLineTokenizer.setNames(line.split(",")))
            .lineMapper(lineMapper)
            .build();
}

在回调方法中,您可以从标题行更新记号赋予器的名称。您还可以在此处添加一些验证逻辑。使用此解决方案,不需要编写您自己的LineTokenizer实现。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40873311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档