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

如何使用Spring-Batch读取多个文件块?

宇文修筠
2023-03-14

我正在使用Spring-Batch使用MultiResourceItemReader按顺序读取csv文件。

我想创造一个读者

  • 从文件1读取chunksize

现在,MultiResourceItemReader的问题是,它将首先分块读取完整的文件1,当文件完成时,它将继续读取文件2。

如何创建基于块大小在文件之间切换的批处理步骤?

共有2个答案

艾茂学
2023-03-14

你可以用像这样的东西

    @Bean
    public MultiResourceItemReader<Company> readerCompany() throws IOException {

        DelimitedLineTokenizer dlt = new DelimitedLineTokenizer();
        dlt.setDelimiter("^");
        dlt.setNames("name", "cui", "code", "euid", "companyState", "address");
        dlt.setStrict(false);

        return new MultiResourceItemReaderBuilder<Company>()
                .name("readerCompany")
                .resources(inputCompanyResources)
                .delegate(new FlatFileItemReaderBuilder<Company>()
                        .name("getCompanyStatusReader")
                        .fieldSetMapper(new FieldSetMapper<Company>() {
                            @Override
                            public Company mapFieldSet(FieldSet fieldSet) throws BindException {
                                return Company.builder()
                                        .name(fieldSet.readString("name"))
                                        .localId(fieldSet.readString("cui"))
                                        .code(fieldSet.readString("code"))
                                        .companyStatus(readCompanyStatuses(fieldSet.readString("companyState")))
                                        .address(fieldSet.readString("address"))
                                        .internationalId(fieldSet.readString("euid"))
                                        .build();
                            }
                        })
                        .linesToSkip(1)
                        .lineTokenizer(dlt)
                        .build())
                .build();
    }

司浩壤
2023-03-14

您需要创建一个自定义阅读器来解决您正在尝试的问题。您可以使用引擎盖下的FlatFileItemReader进行实际的文件读取,但同时读取两个文件的逻辑您必须自己协调。只是在我的脑海中编码,我期望这样的事情:

public class MultiFileReader implements ItemReader<SomeObject> {

    private List<ItemStreamReader> readers;

    public SomeObject read() {
        SomeObject domainObject = new SomeObject();

        for(ItemStreamReader curReader : readers) {
            domainObject.add(curReader.read());
        }

        return domainObject;
    }
}
 类似资料:
  • 我有两个输入文件,分别是File1和File2。File1包含部分记录,其余部分记录分散到File2,为了创建一条记录,我需要同时读取File1和File2。每条记录的唯一键将位于记录之前的File1和File2中。请您帮助我们如何使用Spring batch reader实现此功能。

  • 我尝试使用spring batch从一个表中读取数据并写入其他表,但现在我的要求是从多个表中读取数据并写入一个文件,所以我们可以通过定义多个作业来实现这一点,但我想使用单个作业来实现,即单个读取器、单个写入器和单个处理器。 请为我提供一些关于这个场景的参考资料。

  • 问题内容: 我想配置为顺序读取特定文件夹内的所有文件。 由于委托将尝试打开一个名为的文件,因此以下内容无效,这当然是无效的。我要在这里更改什么? 等效的xml配置将编写如下,如何将其重写为仅Java的配置? 问题答案: 我认为您应该使用。

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

  • 到目前为止,我的方法是: 挑战是:不能使用。如何正确使用?

  • 问题内容: 如何从倍数数据库中读取项目?我已经知道从文件中可以做到。 以下示例适用于从多个文件读取 这样三个豆子 问题答案: 没有可立即使用的组件可以执行您的要求;唯一的解决方案是编写一个委托给(或委托给或委托给任何通用实现)的自定义。 您需要准备所有必要的东西(数据源,会话,实际数据库读取器),并将所有委派的读取器绑定到您的自定义读取器。 编辑:您需要使用recussion来模拟一个循环,并在整