繁体   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