Spring Batch - 用于不同分隔文件的FlatFileItemReader

时间:2017-07-07 08:57:43

标签: java spring batch-processing file-processing

我有两个不同的文件,一个用管道分隔符分隔" |"一个用逗号","。

我使用Spring Batch使用FlatFileItemReader处理这些文件。我不希望有两个读者和两个编写器的文件。 我能以某种方式为这两个文件设置一个通用的FlatFileItemReader吗?

文件将映射到的对象也是不同的。

3 个答案:

答案 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

找到解释和工作代码