所以,我使用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
除了第一列,我可以成功地生成上述内容,第一列只是每个记录的行数。我尝试过的任何方法都无法在作业运行之间重置自己。
您可以为此使用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文件。 示例类: 我得到的结果是: 注意