在 Apache Camel 中使用 header 附加到 CSV 文件
Append to CSV file with header in Apache Camel
我需要根据收到的消息构建一个 csv 文件。我通过附加到文件来做到这一点:
.toD("file://" + OUTPUT_PATH + "?FileName=${exchangeProperty.OUTPUT_FILENAME}" + "&FileExist=Append")
虽然这很好用,但我 运行 遇到了一个问题。我还需要在 CSV 文件中包含一个 header 行。现在我正在用 .mashall().csv() 编组成 CSV 格式,但是省略了 header.
虽然我可以使用 header 创建 CSV 格式,但:
CsvDataFormat csvFormatWithHeader = new CsvDataFormat();
csvFormatWithHeader.setHeader(Arrays.asList(new String[] { "A", "B", "C", "D" }.clone()));
.marshall(csvFormatWithHeader)
这将为我添加的每一行添加 header 行。
所以我想要实现的是仅在创建新文件时添加 header。
我一直在尝试两种方法,但都没有奏效:
- 检查路径中是否存在文件并相应地应用csv格式
- 使用 bean 或方法设置 marshall 数据格式
作为最后一个选项,我可以在文件关闭时添加 header,但感觉效率很低,因为我不知道该文件可能会变成多大。
如何使用 Apache Camel 2.23.2 实现这些方法中的任何一种。
好的,最终使用 header 我能够使选项 1 起作用。这是我现在的路线:
.setProperty("OUTPUT_FILENAME",method(this, "determineOutputFilename()"))
.setHeader("fileExists", method(this, "outputFileExists"))
.choice()
.when(header("fileExists"))
.marshal().csv()
.endChoice()
.otherwise()
.marshal(csvFormatWithHeader)
.endChoice()
.end()
文件检查逻辑为(在路由class内实现):
public boolean outputFileExists(@ExchangeProperty("OUTPUT_FILENAME") String fileName){
boolean fileExists = new File(PROCESSING_PATH + "/" + fileName).exists();
return fileExists;
}
我需要根据收到的消息构建一个 csv 文件。我通过附加到文件来做到这一点:
.toD("file://" + OUTPUT_PATH + "?FileName=${exchangeProperty.OUTPUT_FILENAME}" + "&FileExist=Append")
虽然这很好用,但我 运行 遇到了一个问题。我还需要在 CSV 文件中包含一个 header 行。现在我正在用 .mashall().csv() 编组成 CSV 格式,但是省略了 header.
虽然我可以使用 header 创建 CSV 格式,但:
CsvDataFormat csvFormatWithHeader = new CsvDataFormat();
csvFormatWithHeader.setHeader(Arrays.asList(new String[] { "A", "B", "C", "D" }.clone()));
.marshall(csvFormatWithHeader)
这将为我添加的每一行添加 header 行。 所以我想要实现的是仅在创建新文件时添加 header。
我一直在尝试两种方法,但都没有奏效:
- 检查路径中是否存在文件并相应地应用csv格式
- 使用 bean 或方法设置 marshall 数据格式
作为最后一个选项,我可以在文件关闭时添加 header,但感觉效率很低,因为我不知道该文件可能会变成多大。
如何使用 Apache Camel 2.23.2 实现这些方法中的任何一种。
好的,最终使用 header 我能够使选项 1 起作用。这是我现在的路线:
.setProperty("OUTPUT_FILENAME",method(this, "determineOutputFilename()"))
.setHeader("fileExists", method(this, "outputFileExists"))
.choice()
.when(header("fileExists"))
.marshal().csv()
.endChoice()
.otherwise()
.marshal(csvFormatWithHeader)
.endChoice()
.end()
文件检查逻辑为(在路由class内实现):
public boolean outputFileExists(@ExchangeProperty("OUTPUT_FILENAME") String fileName){
boolean fileExists = new File(PROCESSING_PATH + "/" + fileName).exists();
return fileExists;
}