如何使用附加字段丰富 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()
是不需要的。
我有一个 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()
是不需要的。