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

使用FlatFileItemReader读取带有名称模式的文件

桂鑫鹏
2023-03-14

我需要使用Spring batch每两个月处理一次输入文件。文件名带有时间戳,因此每次运行时都会更改。

文件名:NY_Prov_mmddyyyy。csv

我正在使用下面的代码来读取文件,我试图只给出目录名,因为fileName中有一个模式,并且文件名不是固定的。但是,这不起作用。

@Bean
    @StepScope
    // FlatfileItemReader to define file properties
    public FlatFileItemReader<Provider> providerItemReader(){
        // create FlatFileItemReader
        FlatFileItemReader<Provider> reader = new FlatFileItemReader<>();
        // skip header
        reader.setLinesToSkip(1);
        reader.setResource(new PathResource(localFileDownloadPath));
        DefaultLineMapper<Provider> customerLineMapper = new DefaultLineMapper<>();
        // tokenizer for delimited file
        DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer();
        customerLineMapper.setLineTokenizer(tokenizer);
        customerLineMapper.setFieldSetMapper(new ProviderFieldSetMapper());
        customerLineMapper.afterPropertiesSet();
        reader.setLineMapper(customerLineMapper);
        return reader ;
    }

application.properties:

local.file.download.path =C:/Users/Desktop/data/in/

错误:

原因:java.lang.IllegalStateException:输入资源必须是可读的(阅读器处于“严格”模式):路径[C:\User\Desktop\data\in]

我也尝试使用MultiResourceItemReader,但也有,我遇到了这个线程中列出的问题:

使用MultiResourceItemReader时没有要读取的资源错误

更新:

如果我在读卡器级别传递参数,那么在步骤级别传递什么?

  @Bean
    public Step step2(){
        // step 2 : Read csv files and dump it into a custom table
        return stepBuilderFactory.get("stepReadLoad")
                .<Provider, Provider>chunk(1000)
                .reader(providerItemReader()) <-- looking for parameter here
                .writer(providerJdbcBatchItemWriter())
                .build();
    }

更新2:

我正在尝试将它与MultiResourceItemReader一起使用。我可能没有正确传递作业参数。

application.properties:

local.input.file.path.pattern =file:C:/Users/Desktop/data/in/*.csv

代码:

@StepScope
   @Bean
    // MultiResourceItemReader to read multiple files sequentially
    public MultiResourceItemReader<Provider> providerMultiResourceItemReader(@Value("#{jobParameters[local.file.download.path.pattern]}") Resource[] resources) {
    //public MultiResourceItemReader<Provider> providerMultiResourceItemReader() {
            MultiResourceItemReader<Provider> multiResourceItemReader = new MultiResourceItemReader<>();
            multiResourceItemReader.setResources(resources);
            //multiResourceItemReader.setResources();
            multiResourceItemReader.setDelegate(providerItemReader());
            multiResourceItemReader.setStrict(true);
            return multiResourceItemReader;

错误:

Caused by: org.springframework.beans.NotReadablePropertyException: Invalid property 'local' of bean class [org.springframework.batch.core.scope.context.StepContext]: Bean property 'local' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?
    

共有1个答案

祁曦哲
2023-03-14

由于文件名是动态的,所以应该将其作为作业参数传递,并在运行时使用后期绑定技术将其注入读取器。下面是一个简单的例子:

@StepScope
@Bean
public FlatFileItemReader<Foo> flatFileItemReader(@Value("#{jobParameters[input.file.name]}") String name) {
    return new FlatFileItemReaderBuilder<Foo>()
            .name("flatFileItemReader")
            .resource(new FileSystemResource(name))
            ...
}
 类似资料:
  • 读取ArrayType值(phoneNumbers)时出错,没有ArrayType值,我可以读取其余值。 当我这样做时。show,它只显示列名,没有值,但当我不使用“phoneNumbers”数组时,它可以正常工作。

  • 问题内容: 我正在阅读脚本的运行时配置。 我想拥有不提供部分名称的灵活性(有些脚本很简单;它们不需要“部分”)。将抛出异常,并且不接受该文件。 如何才能使ConfigParser仅仅检索没有节名的配置文件的元组? 例如: 我宁愿不写配置文件。 问题答案: Alex Martelli提供了一种用于解析文件(显然是无节的配置文件)的解决方案。 例如: 即将是一种.config格式,除了它缺少开头部分的

  • 我目前正在写一个代码,我需要读取给定文件的名称,并创建一个新的文件,只改变扩展名。我输入文件的方式是 我怎么能得到fileName并将其转换成字符串使用Java,我尝试了扫描仪和BufferedReader,但它只允许我读取内部文件,但不是fileName?

  • 问题内容: 出于某种原因,我使用以下代码将文件名始终保持为“ 1”: 当我在$ results_array中回显每个元素时,我得到了一堆‘1’,而不是文件名。如何获得文件名? 问题答案: 不要打扰open / readdir,而使用:

  • 问题内容: 我正在尝试使用FileInputStream打开名称中包含空格的文件。 例如: 结果是抛出了FileNotFoundException。我试图对filePath进行硬编码,以仅查看是否应该转义空格字符,但它似乎没有用。关于这个问题有什么建议吗? 编辑:只是与每个人都在同一个页面上查看此问题…打开名称中没有空格的文件有效,具有空格的文件将失败。权限既不是这里的问题,也不不是文件夹分隔符。

  • 我想知道下面的模式对于Avro模式是否有效。请注意,字段数组的第一个对象中缺少名称。 它实际上是针对以下类型的数据设计的 根据下面的阅读,似乎没有名字的数组是不允许的 Avro架构失败 https://avro.apache.org/docs/current/spec.html#schema_complex 我怀疑下面是正确的 它应该有如下数据,以便成功进行avro转换 下面的模式是否有效?在第一