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

使用Spring批处理将多个csv文件合并为单个csv

屠锦
2023-03-14

我有一个商业案例,使用Spring batch将多个csv文件(每个文件大约1000个,包含1000条记录)合并成单个csv。

请帮助我提供方法和性能方面的指导和解决方案。

到目前为止,我已经尝试了两种方法,

方法1。

Tasklet chunk与multiResourceItemReader一起从目录中读取文件,FlatFileItemWriter作为项目编写器。

这里的问题是,它的处理速度非常慢,因为这是单线程的,但这种方法按预期工作。

方法2:使用MultiResourcePartitioner partitioner和AsynTaskExceutor作为任务执行器。

这里的问题是,由于它是异步多线程,数据在合并到最终的单个文件时被覆盖/损坏。

共有2个答案

金子轩
2023-03-14

由于源文件和目标文件之间的标题很常见,我不建议使用Spring Batch提供的读取器将行转换为特定的bean,因为不需要列级别的信息

而且,每个文件的分区速度会非常慢(如果有那么多文件)

我的建议是编写自定义阅读器

如果您有足够的内存来保存所有文件中的行,那么您可以一次读取所有文件

宋健柏
2023-03-14

您可以将FlatFileItemWriter包装在AsyncItemWriter中,并与AsyncItemProcessor一起使用。这不会损坏数据并提高性能,因为处理和写入将通过多个线程进行。

@Bean
    public AsyncItemWriter asyncItemWriter() throws Exception {
        AsyncItemWriter<Customer> asyncItemWriter = new AsyncItemWriter<>();

        asyncItemWriter.setDelegate(flatFileItemWriter);
        asyncItemWriter.afterPropertiesSet();

        return asyncItemWriter;
    }

@Bean
    public AsyncItemProcessor asyncItemProcessor() throws Exception {
        AsyncItemProcessor<Customer, Customer> asyncItemProcessor = new AsyncItemProcessor();

        asyncItemProcessor.setDelegate(itemProcessor());
        asyncItemProcessor.setTaskExecutor(threadPoolTaskExecutor());
        asyncItemProcessor.afterPropertiesSet();

        return asyncItemProcessor;
    }

@Bean
    public TaskExecutor threadPoolTaskExecutor() {

        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(10);
        executor.setMaxPoolSize(10);
        executor.setThreadNamePrefix("default_task_executor_thread");
        executor.initialize();
        return executor;

    }
 类似资料:
  • 我正在寻找一个批处理文件合并所有CSV文件在一个特定的文件夹与行"LF"结束。 下面的脚本创建了一个带有“CRLF”EOL的输出文件,但是我的自动数据加载程序只接受“LF”EOL。 此外,我想在输出文件中有一个头。 帮助将不胜感激,因为我已经浪费了足够的时间寻找解决方案。 这就是我在下面尝试的。

  • 我是Spring批处理的新手,目前正在处理一个新的批处理作业。我的批处理作业: 读取器:读取数据库中的记录(即5家公司的员工) 处理器:处理记录 5个writer:过滤并写入每个文件(即A公司的员工在A路径写入A公司文件,B公司的员工在B路径写入B公司文件),最后一个writer将A公司的所有离职员工写入D公司。 任务:将文件保存到数据库中。 目前,我正在使用CompositeItemWriter

  • 我正在使用spring批处理入站文件,下面是我的用例 将收到包含15个CSV格式文件的zip 我需要并行处理它们 在处理完所有文件后,需要进行一些计算并发送报告 有人能建议我如何使用Spring Batch实现这一点吗?

  • 我有从多个文件读取并写入多个文件的Spring批处理配置。是否可以只写入从多个读取的一个文件。假设我收到巨大的XML文件,我将XML拆分为小文件并使用分区器并行读取小文件。但我需要将从不同的小xml文件读取的所有数据写入一个输出文件。Spring批处理是否可以做到这一点?我知道通过使写入器同步是可能的,但我正在寻找任何其他可能的方式作业配置 我得到错误组织。springframework。一批项目

  • 我目前正在编写spring batch,在这里我读取一个XML数据,对其进行处理,然后将处理结果作为< code>map传递 生成用于编组和解组的JAXB xjc类。JAXB生成的类如下所示。 JAXB员工类 Spring XML配置文件 处理器和写入器: 问题: XML文件对于每个固定的提交间隔都是重写的,很明显,XML文件是在每个提交级别之后创建的。但我必须附加所有

  • 在这里你可以看到我正在处理的一些文件。 与我最相似的问题是这个问题(将一个文本文件文件夹合并到一个CSV中,每个内容都在一个单元格中),但我无法实现那里提出的任何解决方案。 我尝试的最后一个是Nathaniel Verhaaren在前面提到的问题中提出的Python代码,但我得到了与问题作者完全相同的错误(即使在实施了一些建议之后): 与我类似的其他问题(例如,Python:将多个。txt文件解析