簡體   English   中英

如何在使用 Spring Batch FlatFileItemWriter 寫入 csv 文件時跳過空白行

[英]how to skip blank lines while writing to csv file with Spring Batch FlatFileItemWriter

我正在嘗試使用 Spring Batch FlatFifileItemWriter 將 java 數據對象寫入.csv 文件,正如下面位置示例中所述。 http://www.mkyong.com/spring-batch/spring-batch-example-xml-file-to-csv-file/

編寫器配置如下所示。

<bean id="cvsFileItemWriter" class="org.springframework.batch.item.file.FlatFileItemWriter">
    <!-- write to this csv file -->
    <property name="resource" value="file:cvs/report.csv" />
    <property name="shouldDeleteIfExists" value="true" />

    <property name="lineAggregator">
      <bean
        class="org.springframework.batch.item.file.transform.DelimitedLineAggregator">
        <property name="delimiter" value="," />
        <property name="fieldExtractor">
          <bean
            class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor">
            <property name="names" value="refId, name, age, csvDob, income" />
           </bean>
        </property>
       </bean>
    </property>
  </bean>

由於 FlatFileItemWriter 在 API 中具有以下 write() 方法定義,因此即使 LineAggregator 返回空字符串,它仍然會寫入文件。

StringBuilder lines = new StringBuilder();
        int lineCount = 0;
        for (T item : items) {
            lines.append(lineAggregator.aggregate(item) + lineSeparator);
            lineCount++;
        }
        try {
            state.write(lines.toString());
        }

使用 spring 批處理寫入 java 中的 csv 文件時,是否有任何方法可以將其配置為跳過。

您將需要在步驟中添加一個ItemProcessor<YourObject> 在其中,您可以添加一個簡單的YourObject process(YourObject item)方法,該方法檢查對象是否將導致空白行。 如果不是,則返回對象。 如果是這樣,則返回null

這將防止您希望丟棄的項目到達FILTER_COUNT當您查看該步驟的BATCH_STEP_EXECUTION表時,將增加FILTER_COUNT

可以在Spring Batch文檔中找到有關過濾對象的更多信息。

編輯: 在答案中引用的教程包括一個過濾處理器( FilterReportProcessor )的示例。

如果 memberclass 為空,這是另一種使用復合編寫器編寫器的方法。 如下創建另一個作家。

public class YourMemberFileItemWriter extends FlatFileItemWriter<YourMainClass>{
    @Override
    public String doWrite(List<? extends YourMainClass> items) {
        StringBuilder lines = new StringBuilder();
        for (YourMainClass item : items) {
            if ( YourMainClass.getYourMemberClass() != null) {
                lines.append(this.lineAggregator.aggregate(item)).append(this.lineSeparator);
            }
        }
        return lines.toString();
    }
}

定義您的復合編寫器。 CompositeItemWriter compositeItemWriter = new CompositeItemWriter<>(); CompositeItemWriter.setDelegates(Arrays.asList(mainClassCsv(),memberClassCsv());返回compositeItemWriter;

將成員 class 方法如下添加到復合寫入器:

public FlatFileItemWriter memberClassCsv() {
    // TODO Auto-generated method stub
    YourMemberFileItemWriter fileWriter = new YourMemberFileItemWriter();
    fileWriter.setName("yourMemberClass");
    fileWriter.setResource(new FileSystemResource("memberfile.csv"));
    fileWriter.setLineAggregator(getMemberClassDelimitedLineAggregator());
    return fileWriter;
}

public DelimitedLineAggregator<YourMainClass> getMemberClassDelimitedLineAggregator() {
    BeanWrapperFieldExtractor<YourMainClass> beanWrapperFieldExtractor = new BeanWrapperFieldExtractor<YourMainClass>();
    beanWrapperFieldExtractor.setNames(new String[] {
            "memberClassField.fieldname1"
            ,"memberClassField.fieldname2"
            });
    DelimitedLineAggregator<YourMainClass> delimitedLineAggregator = new DelimitedLineAggregator<YourMainClass>();
    delimitedLineAggregator.setDelimiter(",");
    delimitedLineAggregator.setFieldExtractor(beanWrapperFieldExtractor);
    return delimitedLineAggregator; 
}

暫無
暫無

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

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