Talend - 将两行合并为一行

时间:2014-12-23 10:30:23

标签: talend

示例输入

以下是我输入的一个示例。如您所见,地址列有2个值,我想将它们分开,然后组合成一个值。

Input data with merged cells

预期输出

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

Expected output data

Talend输出

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

enter image description here

1 个答案:

答案 0 :(得分:3)

您应该可以通过在Talend中使用tMemorizeRows组件来实现此目的。

一个非常粗略的示例工作可能看起来像:

Job layout

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

Input data hard coded into a tFixedFlowInput component

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

tMemorizeRows component set to memorise everything but to only keep 2 rows in memory at a time

在这种情况下,当您有一个空名称时,需要将上一行中的所有数据拉到下一行,这样我们就可以使用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;

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

tFilterRow component to remove the "DELETE THIS ROW" rows

使用以下输出离开我们:

.-----------+---------------------------+---------------------.
|                           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|
'-----------+---------------------------+---------------------'