如何使用附加字段丰富 csv 内容数据并使用 apache camel 将管道作为分隔符转换为文本文件

How to enrich the csv content data with additional fields and convert into text file with pipe as delimiter using apache camel

我有一个 csv 文件,其中输入内容用逗号“,”分隔。我想用“|”把它转换成文本文件定界符。我正在使用 apache camel CsvDataFormat 来转换给定的 csv 数据 format.I 可以将 csv 内容转换为管道分隔的字符串。我还有两个常量,我已分配给两个 variables.I 想用两个额外的字段来丰富输出数据的内容,如预期输出所示。

输入

test.csv

Jack Dalton, 115, mad at Averell 
Joe Dalton, 105, calming Joe 
William Dalton, 105, keeping Joe from killing 
Averell Averell Dalton, 80, playing with Rantanplan 
Lucky Luke, 120, capturing the Daltons

Test.java

public class Test{
    private String name = "Hell0";
    private String address = "134 johen rd";
}

ConverterRoute.java

public class ConverterRoute implements RoutesBuilder {

    private static final String SOURCE_INPUT_PATH = "file://inbox?fileName=test.csv";

    private static final String SOURCE_OUTPUT_PATH = "file://outbox?fileName=file.txt";

    public void addRoutesToCamelContext(CamelContext context) throws Exception {

        context.addRoutes(new RouteBuilder() {
            public void configure() {
                try {
                    CsvDataFormat csvDataFormat = new CsvDataFormat();
                    csvDataFormat.setDelimiter('|');
                    csvDataFormat.setHeaderDisabled(true);

                    from(SOURCE_INPUT_PATH).
                            unmarshal().csv().
                            marshal(csvDataFormat).
                            to(SOURCE_OUTPUT_PATH)
                            .end();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

输出

file.txt

Jack Dalton| 115 | mad at Averell 
Joe Dalton| 105 | calming Joe
William Dalton | 105 | keeping Joe from killing
Averell Averell Dalton| 80| playing with Rantanplan
Lucky Luke| 120| capturing the Daltons

预期输出

file.txt

Jack Dalton| 115 | mad at Averell | Hell0 | 134 johen rd
Joe Dalton| 105 | calming Joe | Hell0 | 134 johen rd
William Dalton | 105 | keeping Joe from killing | Hell0 | 134 johen rd
Averell Averell Dalton| 80| playing with Rantanplan | Hell0 | 134 johen rd
Lucky Luke| 120| capturing the Daltons | Hell0 | 134 johen rd

在上面的输出中 file.txt 最后两列是我在 Test.java pojo class 中的两个常量。我想将我的 pojo 字段丰富到最终输出中。有什么办法可以达到这个结果。

在你的路线之后的步骤

unmarshal().csv()

您收到了 List<List<String>> 作为邮件正文。外部列表的每个列表条目代表一个 CSV 行,每个内部列表包含一行的值。

您要做的是向每个内部列表添加两个值。

由于每个 "line" 的值都相同,因此编写一个采用 List<List<String>> 的普通 Java Bean 迭代外部列表可能是最简单的方法并将这两个值(列表条目)添加到每个内部列表。

在您的 Camel 路由中,您使用

调用此 bean
.bean(YourBean.class, "methodname")

但是methodname只有当Bean有多个方法时才需要

然后你的路线继续

.marshal(csvDataFormat)
.to(SOURCE_OUTPUT_PATH)

这应该会生成您想要的文件。

顺便说一句,路由末端的.end()是不需要的。