当前位置: 首页 > 知识库问答 >
问题:

将行写入csv文件时,如何在Spring Batch中的FlatFileItemWriter中包含计数器

郤仰岳
2023-03-14

所以,我使用FlatFileItemWriter从数据库中成功读取的数据中编写csv文件。

我正在努力编写一个整数(即行计数器)对应于我正在写入文件的行。似乎是一件容易的事情,但很简单,我被难住了。

一切正常(从数据库读取的数据生成文件)。但我似乎不知道如何实现getCount()方法,从而获得相应行的计数。我认为这与利用ChunkContext有关,但我似乎无法理解。

因此,在我的作业配置中,我在bean中有以下内容。

@Bean
public FlatFileItemWriter<Customer> customerItemWriter() throws Exception {

    FlatFileItemWriter<Customer> itemWriter = new FlatFileItemWriter<>();

    itemWriter.setLineAggregator(new CustomerLineAggregator());
    itemWriter.setResource(new FileSystemResource("/some/directory/file.csv"));
    itemWriter.afterPropertiesSet();

    return itemWriter;
}

我还有下面的LineAggregator实现。

public class CustomerLineAggregator implements LineAggregator<Customer> {
    
    private ChunkContext chunkContext;
    
    @BeforeChunk
    private void beforeChunk(ChunkContext chunkContext) {
        this.setChunkContext(chunkContext);
    }
        
    @Override
    html" target="_blank">public String aggregate(Customer item) {
        
        return getCount() + "," + convertTime(item.getTime(), 3) + " ET," + item.getCustomerId() + "," + item.getLink() + "," + item.getName();
    }
    
    
    private String convertTime(String timeString, int offset) {
        
        LocalTime timeObject = LocalTime.parse(timeString);
        
        LocalTime timeOffsetObject = timeObject.plusHours(offset);
        
        return timeOffsetObject.toString();
        
    }
    
    private String getCount() {
        // how do I make use of the chunk context to infer the integer corresponding to the item assuming my chunk size is 1.
        return someCountString;
    }
    

    public ChunkContext getChunkContext() {
        return chunkContext;
    }

    public void setChunkContext(ChunkContext chunkContext) {
        this.chunkContext = chunkContext;
    }
    

}

预期的输出文件应如下所示:

1, 10:09 ET, 742, https://www.firm.com, John Doe
2, 12:30 ET, 235, http://www.firm.com, Jane Doe
3, 9:21 ET, 398, http://www.thomas.io, Thomas Chan
4, 14:38 ET, 104, http://www.googl.com, Cindy Chen

除了第一列,我可以成功地生成上述内容,第一列只是每个记录的行数。我尝试过的任何方法都无法在作业运行之间重置自己。

共有1个答案

终育
2023-03-14

您可以为此使用ItemCountAware接口。此接口由您的域对象(在您的情况下似乎是Client)实现,并且将在读取时由任何扩展AbstractItemCounting ItemStreamItemReader的阅读器调用。

因此,如果你的读者是他们中的一员,你可以获得你物品的物品数量,并根据需要在线性聚集器中使用它。

编辑:当读取器未扩展AbstractItemCountingItemStreamItemReader

您始终可以在ItemReadListener#postRead中分配项目编号并在聚合器中使用它,例如:

class ItemNumberListener implements ItemReadListener<Customer> {
    int number;
    @Override
    public void afterRead(Customer customer) {
        customer.setNumber(number++);
    }
    // other methods from ItemReadListener
}

设置好后,在步骤中注册此侦听器,并在线性聚合器中使用项目编号。此方法适用于所有读卡器(基于光标或基于分页)。

注意:如果不能在Customer对象(可能是一个不能修改的类)中添加字段getter/setter,可以将其封装在自定义对象中,如numberawarecuster,并在批处理应用程序中使用该类型。

 类似资料:
  • 我想用javascript在csv文件的列中写一个字符串。我使用下面的代码,但是它在一列中写入整个字符串。 这就是我如何创建csv fi: 有什么建议吗?

  • 我试图将数据写入csv文件,我创建了四列作为 除了序列号,其他三个字段是列表

  • 问题内容: 我正在尝试将数据整理到.CSV文件中。我想将数据放在特定的行中,所以我尝试将“ \ n”放进去,但是它不起作用。请帮助我将数据放入特定的行中。谢谢提前.. 问题答案: 您的代码看起来不错,并且我确定换行符已正确写入文件中。我能想到的唯一原因是,您使用的编辑器未将文件视为行分隔符,而是将对视为行分隔符(如Windows上的记事本)打开了文件。 因此,您可以使用编写换行符,也可以使用诸如的

  • 问题内容: 我想打开一个新的文本文件,然后将numpy数组保存到该文件。我写了这段代码: 我收到此错误: 有人知道怎么了吗? 另外,我在终端中找到了一个名为file_2的空文件,但是里面没有任何内容。 编辑:我正在使用Python3.4 问题答案: 看来您正在使用Python3。因此,请以二进制模式()而非文本模式()打开文件: 另外,关闭文件句柄,以确保将所有内容都写入磁盘。您可以使用-stat

  • 我有一个数据集,它只包含头(id、名称、年龄)和0行。我想将它作为csv文件写入hdfs位置,使用

  • 我使用supercsv CsvBeanWriter将值写入csv文件。 示例类: 我得到的结果是: 注意