1

您好,我正在使用骆驼绑定组件处理 CSV 文件,在该文件中,我将数据拆分为 1000 行块,并为每个块生成标题列,我需要它应该只用单个文件生成一次。我的路线:

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
}

我的问题是如何制作此代码,以便为单个文件生成一次标题?

4

1 回答 1

1

每行都有一个标题,因为您处理每一行并附加到文件中。在这种情况下,您必须在第一行之后设置generateHeaderColumnsto false,因为只有文件知道当前行是否是第一行。

任何一个

  1. 在编组之前收集(聚合)文件的全部数据(见下文)
  2. 或者您在文件开头“手动”添加标题generateHeaderColumns并设置为false
  3. 或者您根本不拆分文件以从中获取对象列表unmarshal(见下文)

对于#1,您必须实现一个AggregationStrategy收集列表中所有对象的方法。请参阅此处并查找ArrayListAggregationStrategy.java示例。

对于#3,结果unmarshal是一个地图列表,其中每个地图包含来自 1 个 CSV 行的模型对象(在您的情况下,每个地图应该只有 1 个对象)。然后您的 bean 可以遍历 List(而不是在一行上工作),提取模型对象并将它们收集到 List 中以再次编组它们。有关更多详细信息,请参阅该部分下的Camel Bindy 文档Unmarshaling

于 2018-03-07T06:36:34.587 回答