您好我正在使用camel bindy组件处理CSV文件,其中我将数据拆分为1000行块并且每个块生成标题列,我需要它只应生成一次单个文件。 MyRoute:
final DataFormat inputCSV = new BindyCsvDataFormat(InputCSV.class);
final DataFormat outputCSV = new BindyCsvDataFormat(OutputCSV.class);
@Override
public void configure() throws Exception {
from("file:inbox/inputFile?fileName=inputProducts.csv&noop=true")
.split().tokenize("\\n", 1000)
.unmarshal(inputCSV)
.bean(Processor.class, "processCSV")
.marshal(outputCSV)
.to("file:inbox/outputFile?fileExist=append&fileName=outputProduct.csv");
}
我的OutputCSV.java pojo
@CsvRecord(separator = ",",generateHeaderColumns=true)
public class OutputCSV implements Serializable {
private static final long serialVersionUID = 1L;
@DataField(pos = 1, required = true)
private String product_id;
@DataField(pos = 2, required = true)
private String product_name;
//Getter and setter
}
我的问题是如何制作此代码,以便为单个文件生成一次标头?
答案 0 :(得分:1)
每行都会得到一个标题,因为您处理每一行并附加到该文件。在这种情况下,您必须在第一行之后将generateHeaderColumns
设置为false
,因为只有文件知道当前行是否是第一行。
要么
generateHeaderColumns
设置为false
unmarshal
中的对象列表(见下文)对于#1,您必须实现一个AggregationStrategy
来收集List中的所有对象。请参阅here并查找ArrayListAggregationStrategy.java
以获取示例。
对于#3,unmarshal
的结果是地图列表,其中每个地图包含来自1个CSV行的模型对象(在您的情况下,每个地图应该只有1个对象)。然后你的bean可以遍历List(而不是在一行上),提取模型对象并在List中收集它们以再次编组它们。有关详细信息,请参阅Unmarshaling
部分下的Camel Bindy docs。