如何停止在单个文件中生成多个时间标题列,在bindy组件中?

时间:2018-03-07 05:28:28

标签: apache-camel bindy

您好我正在使用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
}

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

1 个答案:

答案 0 :(得分:1)

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

要么

  1. 收集(聚合)文件的整个数据,然后再编组(见下文)
  2. 或者您在文件开头添加标题“手动”,并将generateHeaderColumns设置为false
  3. 或者根本不拆分文件以获取unmarshal中的对象列表(见下文)
  4. 对于#1,您必须实现一个AggregationStrategy来收集List中的所有对象。请参阅here并查找ArrayListAggregationStrategy.java以获取示例。

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