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

Spring批处理-FlatFileReader中是否可能有一个动态列?

冷俊健
2023-03-14

我正在处理许多没有固定头/列的CSV文件,说我可以得到file1。包含10列和文件2的csv。csv包含50列。

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

当我想使用Spring Batch自动导入这些CSV时,我想知道这是否可能?我知道我必须获得固定数量的列,因为处理器以及我需要将数据序列化为POJO然后再将其发送回写入器。

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

你怎么认为?

谢谢

共有2个答案

寿高阳
2023-03-14

创建您自己的LineTokenizer实现。分隔的LineTokenizer需要预定义的列数。如果您自己创建,您可以随心所欲地动态。您可以在留档中阅读有关LineTokenizer的更多信息:http://docs.spring.io/spring-batch/apidocs/org/springframework/batch/item/file/transform/LineTokenizer.html

许天逸
2023-03-14

我带着同样的问题来到这个老帖子。最后,我在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实现。

 类似资料:
  • 嗨,我是新春批。 我有如下Spring批次的情况: 我需要运行所有促销的批处理[促销列表] > 在这里,我想再次从batch中读取上面的动态查询,因为它返回的结果至少为5万条记录。 以下是我所期待的过程,这在Spring批次中是否可行? 阅读促销【读者逐一阅读促销】 创建查询并将其放在上下文中 传递给下一个读者 读取器逐个读取事务 处理交易并计算积分 我这里的问题是不能写嵌套块[一个用于读取提升,

  • 现在我正在用Apache Kafka做一些测试。在Kafka生产者的配置中,参数batch.size和linger.ms控制批处理策略。是否可以在生产的同时动态地制作这些参数?例如。如果数据摄取率上升很快,我们可能希望增加batch.size以每批积累更多的消息。我没有找到任何动态批处理与Kafka生产者的例子。有没有可能实施?

  • 我读过spring batch中的分区,我发现了一个演示分区的示例。该示例从CSV文件中读取人员,进行一些处理,并将数据插入数据库。在本例中,1 partitioning=1 file,因此partitioner实现如下所示: 但如果我有一个10TB的文件呢?spring批处理是否允许以某种方式对其进行分区? 我尝试了以下方法来实现我的目标: 分为两步——第一步将文件分成若干部分,第二步处理第一步

  • 我使用的是SDN3.1.0.发行版。我尝试danamic标签查询,比如 我可以在@Query中使用动态标签吗?

  • 是否可以在Spring批处理中动态配置作业? 这是我想做的。我创建了几个不同的,如下所示: FlatFileItemReader 我希望能够在创建批处理作业时动态混合和匹配它们。例如,假设我需要一个有2个步骤的作业。第一步包含一个用于预处理的。第二步将有一个,用于使用我的阅读器/写入器进行基于块的数据处理......类似这样的东西: 在XML中,我可以执行以下操作: 但是我如何像上面一样以编程方式

  • 我在XML中定义了注入的流,如下所示: 因此,正如您所看到的,我实际上是从的方法启动方法(用于动态创建这些作业定义)。我不确定这是对的。它正在运行,但我不确定是否有一个不同的入口点更适合于这个目的。老实说,我也不知道注释的意义是什么。 当前遇到的问题是,当我从调用时,它会引发以下: 若要使用默认的BatchConfigurer,上下文必须包含一个以上的数据源(found 2)。 注意:我的项目实际