我有一个路径,假设读取一个巨大的XML文件,然后写一个带有头的CSV文件。XML记录需要首先转换,所以我将其Map到java POJO,然后再次封送它以写入CSV文件。
我无法加载内存中的所有记录,因为该文件包含200k以上的记录。
问题:我只看到最后一条记录被添加到CSV文件中。不确定为什么它没有将数据附加到现有文件中。
如何让它工作的任何想法。标头是CSV中必需的。我没有看到任何其他选项直接转换流并将标头写入CSV,而不首先将其解组到Pojo。我也尝试使用BeanIO,这需要我添加一个标头记录,但不确定如何将其注入流中。
from("{{xml.files.route}}")
.split(body().tokenizeXML("EMPLOYEE", null))
.streaming()
.unmarshal().jacksonXml(Employee.class)
.marshal(bindyDataFormat)
.to("file://C:/Files/Test/emp/csv/?fileName=test.csv")
.end();
如果我尝试附加到现有文件,那么CSV文件会将标题附加到记录的每个迭代。
.to("file://C:/Files/Test/emp/csv/?fileName=test.csv&fileExist=append")
1条答案
按热度按时间ovfsdjhp1#
这里的问题与camel-bindy有关,而不是file-component。它希望你封送集合对象而不是单个对象,因此如果你单独封送每个对象,并且在Employee类上有
@CsvRecord(generateHeaderColumns = true )
,那么每次封送单个Employee对象时,你都会得到头。您可以将
generateHeaderColumns
设置为false并手动启动带有头字符串的文件。获取Bindy注解类的头的一种方法是使用apache-commons中的org.apache.commons.lang3.reflect.FieldUtils
获取带有DataField注解的字段,并基于position、columnName和fieldName构造头字符串。当我需要将一些内容流到文件时,我通常更喜欢camel-stream而不是file-component,但是使用带有append的file-component可能也同样有效。
范例:
第一个