我有两个不同的文件,一个用管道分隔符分隔" |"一个用逗号","。
我使用Spring Batch使用FlatFileItemReader处理这些文件。我不希望有两个读者和两个编写器的文件。 我能以某种方式为这两个文件设置一个通用的FlatFileItemReader吗?
文件将映射到的对象也是不同的。
答案 0 :(得分:1)
您可以注入DelimitedLineTokenizer,您可以根据需要设置分隔符。你可以使用StepExecutionListener使它成为通用的,并且需要覆盖beforeStep()方法。您将在StepExecution中设置分隔符。 解析文件时,","然后分开 stepExecution.getExecutionContext()。putString(" delimiter",","); 当文件与" |"分开时然后 stepExecution.getExecutionContext()。putString(" delimiter"," |");
但你需要创造两个工作。需要相应地指定监听器。
您可以从Spring Batch on Walking Techie中看到上述解释逻辑的示例 通用读者代码:
@Bean
@StepScope
public FlatFileItemReader<Domain> reader(@Value("#{stepExecutionContext[delimiter]}") String delimiter) {
FlatFileItemReader<Domain> reader = new FlatFileItemReader<>();
reader.setResource(new ClassPathResource("sample-data.csv"));
reader.setLineMapper(new DefaultLineMapper<Domain>() {{
setLineTokenizer(new DelimitedLineTokenizer() {{
setNames(new String[]{"id", "name"});
setDelimiter(delimiter);
}});
setFieldSetMapper(new BeanWrapperFieldSetMapper<Domain>() {{
setTargetType(Domain.class);
}});
}});
return reader;
}
您可以在Spring Batch Tutorial的春季启动中找到春季批次的许多示例。您可以在这里找到与弹簧批次相关的所有问题。
答案 1 :(得分:0)
您可以将DelimitedLineTokenizer注入FlatFileItemReader并为其设置分隔符值。 XML配置的相关部分如下
<bean id="pipeDelimitedFileItemReader" class="org.springframework.batch.item.file.FlatFileItemReader">
...
<property name="lineMapper">
<bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
<property name="lineTokenizer">
<bean class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
...
<property name="delimiter" value="|"/>
</bean>
</property>
...
</bean>
</property>
...
</bean>
你可以,例如类似地配置另一个commaDelimitedFileItemReader bean(逗号实际上是DelimitedLineTokenizer的默认分隔符值)
答案 2 :(得分:0)
我在spring boot中创建了一个示例弹簧批处理程序,它将创建两个作业,一个作业将处理从CSV文件中读取数据,该文件由逗号和其他作业分隔,以从CSV文件中读取数据,该文件由管道分隔(&#34; |&#34)。这两个作业都使用相同的通用FlatFileItemReader从CSV文件读取数据,使用MongoItemWriter将数据写入MongoDB。
您可以从Spring Batch Example in Spring Boot - CSV Files with different delimiter to Mongo Database
找到解释和工作代码