我需要使用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?
由于文件名是动态的,所以应该将其作为作业参数传递,并在运行时使用后期绑定技术将其注入读取器。下面是一个简单的例子:
@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转换 下面的模式是否有效?在第一