簡體   English   中英

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

[英]Spring Batch - FlatFileItemReader for different delimited files

我有兩個不同的文件,一個用管道分隔符“ |”分隔 還有一個用逗號“,”。

我正在使用Spring Batch使用FlatFileItemReader處理這些文件。 我不想有兩個讀者和兩個作家的文件。 我可以為這兩個文件使用一個通用的FlatFileItemReader嗎?

文件將映射到的對象也不同。

您可以注入DelimitedLineTokenizer,並可以根據需要設置定界符。 您可以使用StepExecutionListener使其通用,並需要覆蓋beforeStep()方法。 您將在StepExecution中設置定界符。 當您解析“,”文件時,則分別分隔stepExecution.getExecutionContext()。putString(“ delimiter”,“,”); 當文件以“ |”分隔時 然后stepExecution.getExecutionContext()。putString(“ delimiter”,“ |”);

但是您需要創建兩個作業。 需要相應地指定監聽器。

您可以在Walking Techie上的Spring Batch中看到上面解釋邏輯的示例
通用閱讀器的代碼:

@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中的spring boot中找到有關spring batch的許多示例。 您將在這里找到與彈簧批處理有關的所有問題。

您可以將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的默認分隔符值)

我已經在Spring Boot中創建了一個示例Spring Batch程序,該程序將創建兩個作業,一個作業將處理以逗號分隔的CSV文件中的數據讀取,其他作業將以豎線分隔的CSV文件中的數據讀取(“ | ”)。 這兩個作業都使用相同的通用FlatFileItemReader從CSV文件讀取數據,並使用MongoItemWriter將數據寫入MongoDB。

您可以在Spring Boot的Spring Batch示例中找到說明和工作代碼-帶有與Mongo數據庫不同的分隔符的CSV文件

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM