我目前正在处理一个Spring Batch CSV导出。使用基于块的读取器、写入器和处理器。读取和处理工作无懈可击,但是FlatFileItemWriter总是覆盖输出的CSV文件。我希望作业检查是否存在一个文件,如果它存在,增加文件名,并写到一个新的文件。
下面是我当前的代码:Helper类,它检查文件是否存在,并返回新字符串供编写器使用。
import java.io.File;
import org.springframework.stereotype.Component;
@Component
public class OrderFileManager {
private final String orderDesc = "order";
private final String fileEnding = ".csv";
public String getEmptyOrderNameString() {
int fileNumber = 1;
String answer = orderDesc + fileNumber + fileEnding;
while (new File(answer).exists()) {
fileNumber = fileNumber + 1;
answer = orderDesc + fileNumber + fileEnding;
}
return answer;
}
}
我的项目编写器:
@Bean
public FlatFileItemWriter<UltravisionOrder> writer(String fileName) {
FlatFileItemWriter<UltravisionOrder> writer = new FlatFileItemWriter<UltravisionOrder>();
writer.setResource(new FileSystemResource(fileName));
DelimitedLineAggregator<UltravisionOrder> delimitedLineAggregator = new DelimitedLineAggregator<UltravisionOrder>();
delimitedLineAggregator.setDelimiter(";");
BeanWrapperFieldExtractor<UltravisionOrder> fieldExtractor = new BeanWrapperFieldExtractor<UltravisionOrder>();
fieldExtractor.setNames(new String[] { "col1", "col2", "col3", ... });
delimitedLineAggregator.setFieldExtractor(fieldExtractor);
writer.setLineAggregator(delimitedLineAggregator);
return writer;
}
每次执行作业时,FileWriter都会写入相同的输出文件。OrderFileManager在工作中是独立的。编写器接收OrderFileManager。作为参数的getEmptyOrderNameString()。
如果Spring应用程序上下文没有在每次作业运行时重新加载,那么文件编写器bean将被重新使用,并且始终写入相同的资源。
您可以通过调用使用SpEL表达式生成文件名的方法来确定writer步骤的范围并对其进行配置:
@Bean
@StepScope
public FlatFileItemWriter<UltravisionOrder> itemWriter(@Value("#{orderFileManager.getEmptyOrderNameString()}") String fileName) {
// ...
}
我如何让IntelliJ IDEA在文件的每一端插入一个新行,这样GitHub就不会抱怨例如?
我有以下文件在蒙戈收藏- 我想将此文档添加到Mongo,只有当具有,和值的类似文档中不存在时。 如果确实存在类似的文档,我希望仅更新timesSeen(递增1)和lastSeen(设置今天的日期)值。 这样做的正确和最有效的方法是什么?我是否可以使用一个命令来执行此操作,而无需在之前搜索相关文档并插入新文档/根据该命令更新现有文档
问题内容: 我正在尝试将Flask应用程序上传到AWS,但是这样做却收到错误消息: 你的WSGIPath引用的文件不存在。 在进行一些在线挖掘之后,我发现在.ebextensions文件夹中,我应该指定路径。没有.ebextensions文件夹,因此我创建了一个文件夹,并将以下代码添加到名为settings.config的文件中: WSGIPath是application.py文件的正确路径,因此
问题内容: 我有以下代码: 在控制台中,使用System.out.println(line)输出的代码为我提供了正确的输出。但是,当我打开CSV文件时,它似乎是反向写入的。Excel首先抱怨行数。但是,仅显示原始数据集的最后一行。数据集(以一种低效的方式进行了预处理)包含1000多个行。因此,我不能简单地附加每个条目。 有更好的方法吗? 提示和技巧非常受欢迎。更进一步,我尝试了一些编写器:-CSV
昨天,我尝试使用Composer在我的Laravel 4项目中的一个项目上安装,我记不清事件链,但它没有成功安装。从那以后,我一直收到Composer内存不足的错误-。 我将php.ini
阅读器bean 我尝试这样做:在FlatFileItemReader的实现中,将输入文件路径作为string属性添加到ExecutionContext的映射中。在我的FlatFileItemWriter实现中-重写setResource,并实际从ExecutionContext的值中创建一个Resource对象。这样行吗?