如何在春季批处理中在单个项目读取器中读取逗号分隔和管道分隔的csv文件 [英] how to read both comma separated and pipe line separated csv file in a single item reader in spring batch
问题描述
我是小树枝批量生产的新手. 我有一个包含多个csv文件的文件夹,我已经实现了MultiResourceItemReader()来读取这些文件.仅当所有csv文件都用管道线("|")分隔时,该选项才起作用.
I am new to sprig batch. I have a folder which contain multiple csv file, I have implemented MultiResourceItemReader () to read those file . It is working only if all csv file are pipe line ("|") separated.
我想使用单个阅读器读取逗号(,")分隔的csv和管道分隔的csv.是否有可能 ?如果是,怎么办?
I want to read both comma (",") separated csv and pipe line separated csv using single reader. Is it possible ? if yes how ?
这是我的代码
@Bean
@StepScope
public MultiResourceItemReader<Person> multiResourceItemReader(@Value("#{jobParameters[x]}") String x,@Value("#{jobParameters[y]}") String y,@Value("#{jobParameters[z]}") String z) {
Resource[] resourcessss = null;
ClassLoader cl = this.getClass().getClassLoader();
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(cl);
try {
resourcessss = resolver.getResources("file:" + z);
}catch(Exception e) {
}
MultiResourceItemReader<Person> resourceItemReader = new MultiResourceItemReader<Person>();
resourceItemReader.setResources(resourcessss);
resourceItemReader.setDelegate(reader());
return resourceItemReader;
}
@Bean
public FlatFileItemReader<Person> reader() {
FlatFileItemReader<Person> reader = new FlatFileItemReader<Person>();
reader.setLineMapper(new DefaultLineMapper() {
{
setLineTokenizer(new DelimitedLineTokenizer() {
{
setNames(new String[]{"Id","postCode"});
}
{
setDelimiter("|");
}
});
setFieldSetMapper(new BeanWrapperFieldSetMapper<Person>() {
{
setTargetType(Person.class);
}
});
}
});
return reader;
}
推荐答案
看看PatternMatchingCompositeLineTokenizer
.在这里,您可以使用Pattern
来标识由什么LineTokenizer
解析哪些记录.在您的情况下,您将有一个Pattern
标识以逗号分隔的记录,并将它们映射到通过逗号解析的令牌生成器.您还将有一个Pattern
,它标识由管道分隔的记录,并将它们映射到相应的LineTokenizer
.看起来像这样:
Take a look at the PatternMatchingCompositeLineTokenizer
. There, you can use a Pattern
to identify what records get parsed by what LineTokenizer
. In your case, you'd have one Pattern
that identifies comma delimited records and map them to the tokenizer that parses via commas. You'd also have a Pattern
that identifies records delimited by pipes and maps those to the appropriate LineTokenizer
. It would look something like this:
@Bean
public LineTokenizer compositeLineTokenizer() throws Exception {
DelimitedLineTokenizer commaTokenizer = new DelimitedLineTokenizer();
commaTokenizer.setNames("a", "b", "c");
commaTokenizer.setDelimiter(",");
commaTokenizer.afterPropertiesSet();
DelimitedLineTokenizer pipeTokenizer = new DelimitedLineTokenizer();
pipeTokenizer.setNames("a", "b", "c");
pipeTokenizer.setDelimiter("|");
pipeTokenizer.afterPropertiesSet();
// I have not tested the patterns here so they may need to be adjusted
Map<String, LineTokenizer> tokenizers = new HashMap<>(2);
tokenizers.put("*,*", commaTokenizer);
tokenizers.put("*|*", pipeTokenizer);
PatternMatchingCompositeLineTokenizer lineTokenizer = new PatternMatchingCompositeLineTokenizer();
lineTokenizer.setTokenizers(tokenizers);
return lineTokenizer;
}
这篇关于如何在春季批处理中在单个项目读取器中读取逗号分隔和管道分隔的csv文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!