[英]how to read both comma separated and pipe line separated csv file in a single item reader in spring batch
I am new to sprig batch.我是新来的小枝批。 I have a folder which contain multiple csv file, I have implemented MultiResourceItemReader () to read those file.我有一个包含多个 csv 文件的文件夹,我已经实现了 MultiResourceItemReader () 来读取这些文件。 It is working only if all csv file are pipe line ("|") separated.只有当所有 csv 文件都被 pipe 行(“|”)分隔时,它才有效。
I want to read both comma (",") separated csv and pipe line separated csv using single reader.我想使用单个阅读器读取逗号 (",") 分隔的 csv 和 pipe 行分隔的 csv 。 Is it possible?可能吗? if yes how?如果是的话怎么办?
Here is my code这是我的代码
@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;
}
Take a look at the PatternMatchingCompositeLineTokenizer
.看看PatternMatchingCompositeLineTokenizer
。 There, you can use a Pattern
to identify what records get parsed by what LineTokenizer
.在那里,您可以使用Pattern
来识别LineTokenizer
解析了哪些记录。 In your case, you'd have one Pattern
that identifies comma delimited records and map them to the tokenizer that parses via commas.在您的情况下,您将有一个Pattern
来标识逗号分隔的记录,并将 map 它们发送到通过逗号解析的标记器。 You'd also have a Pattern
that identifies records delimited by pipes and maps those to the appropriate LineTokenizer
.您还将有一个Pattern
来识别由管道分隔的记录并将它们映射到适当的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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.