我正在处理许多没有固定标题/列的CSV文件,我说我可以得到10列的file1.csv和50列的file2.csv。
我不能提前知道我将拥有的列数,我不能为每种文件类型创建特定的作业,我的输入将是一个黑盒:一串CSV,它将具有从10到无限的X列数。
由于我想使用Spring Batch自动导入这些CSV,我想知道这是否可能?我知道我必须获取固定数量的列,因为处理器,以及在将数据发送回编写器之前,我需要将数据序列化为POJO。
我的处理器可以序列化一个数组吗?除了发送一个简单的对象之外,我是否可以获得一个对象数组,并且在我的工作结束时,我将拥有一个对象数组的数组?
你认为如何?
谢谢
发布于 2016-11-30 03:05:20
创建您自己的LineTokenizer实现。DelimitedLineTokenizer需要预定义的列数。如果你创建自己的,你可以像你想要的那样动态。您可以在此处的文档中阅读有关LineTokenizer的更多信息:http://docs.spring.io/spring-batch/apidocs/org/springframework/batch/item/file/transform/LineTokenizer.html
发布于 2019-11-15 19:17:40
我带着同样的问题来到了这个老帖子。最后,我在skippedLinesCallback的帮助下成功地构建了一个动态列FlatFileItemReader,所以我就把它留在这里:
@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实现。
https://stackoverflow.com/questions/40873311
复制相似问题