Talend - 将两行合二为一

jc *_*elo 5 talend

样本输入

这是我输入的一个例子。如您所见,地址列有 2 个值,我想将它们分开然后合并为一个值。

带有合并单元格的输入数据

预期产出

这就是输出应该是什么,将值合并到一个单元格中。

预期输出数据

Talend 输出

如果我将数据读入 Talend,它看起来像这样:

在此处输入图片说明

yda*_*coR 5

您应该能够通过使用 Talend 中的 tMemorizeRows 组件来完成此任务。

一个非常粗略的示例工作可能如下所示:

岗位布局

我使用 tFixedFlowInput 在这里对一些数据进行硬编码,而不是在 Excel 工作表中读取,但它应该与您在问题中提供的示例相匹配:

输入数据硬编码到 tFixedFlowInput 组件中

tMemorizeRows 组件始终在内存中保留指定数量的行,而不是像平常一样在流程中逐行处理内容(尽管某些组件需要将整个数据集存储在内存中,例如进行排序)。然后可以将其作为数组进行访问。您只想将其设置为记住所有列,并且内存中始终只需要 2 行:

tMemorizeRows 组件设置为记住所有内容,但一次仅在内存中保留 2 行

在这种情况下,当名称为空时,您需要将上一行的所有数据提取到下一行,以便我们可以使用以下示例代码(快速组合在一起)使用 tJavaRow 访问 tMemorizeRows 组件保存的数据:

String name = "";
String address = input_row.address;
String mailingAddress = input_row.mailing_address;

if ("".equals(input_row.name)) {
    name = name_tMemorizeRows_1[1];
    address = address_tMemorizeRows_1[1] + " " + input_row.address;
    mailingAddress = mailing_address_tMemorizeRows_1[1] + " " + input_row.mailing_address;
} else {
    name = "DELETE THIS ROW";
    address = input_row.address;
    mailingAddress = input_row.mailing_address;
}

output_row.name = name;
output_row.address = address;
output_row.mailing_address = mailingAddress;
Run Code Online (Sandbox Code Playgroud)

请注意我如何将非空名称行的名称设置为“DELETE THIS ROW”。然后我可以使用 tFilterRow 从流中删除这一行,这样我们就只剩下我们想要的输出:

tFilterRow 组件删除“DELETE THIS ROW”行

给我们留下以下输出:

.-----------+---------------------------+---------------------.
|                           Output                            |
|=----------+---------------------------+--------------------=|
|name       |address                    |mailing_address      |
|=----------+---------------------------+--------------------=|
|John Carter|Washington Street USA 12345|PO Box 999 USA 12345 |
|Linda Green|London Road UK E20 2ST     |PO Box 998 UK E20 2ST|
'-----------+---------------------------+---------------------'
Run Code Online (Sandbox Code Playgroud)