Talend - 合并两行定界文件以获得一个寄存器

时间:2014-01-23 15:47:40

标签: parsing rows talend delimited-text

我正在解析分隔文件文件以获取我将放入数据库表的信息。

现在,我有一个文件,我必须合并每两行,以获取有关单个寄存器(数据库表的一行)的信息 - 第1行有一些数据库行的字段,第2行有一些其他字段放在同一行。

如何一次处理两行?

例如,假设我有一个包含6行的文件,它对应于我的数据库表中的3个条目,它有9列。从“奇数行”我得到第1,3,4,5,8和9列。从“偶数行”,我得到剩余的信息(第2列,第6列和第7列):

IN  | COLUMN1 | xxxxxxx  | COLUMN3 | COLUMN4 | COLUMN5 | xxxxxxx | xxxxxxx | COLUMN8

OUT | xxxxxxx | COLUMN2 | xxxxxxx  | xxxxxxx | xxxxxxx | COLUMN6 | COLUMN7 | xxxxxxx

IN  | COLUMN1 | xxxxxxx  | COLUMN3 | COLUMN4 | COLUMN5 | xxxxxxx | xxxxxxx | COLUMN8

OUT | xxxxxxx | COLUMN2 | xxxxxxx  | xxxxxxx | xxxxxxx | COLUMN6 | COLUMN7 | xxxxxxx

IN  | COLUMN1 | xxxxxxx  | COLUMN3 | COLUMN4 | COLUMN5 | xxxxxxx | xxxxxxx | COLUMN8

OUT | xxxxxxx | COLUMN2 | xxxxxxx  | xxxxxxx | xxxxxxx | COLUMN6 | COLUMN7 | xxxxxxx

1 个答案:

答案 0 :(得分:2)

您可以尝试将文件拆分为2种类型的行,然后使用tMap加入它们。

为了进一步说明你要根据它是IN还是OUT来拆分文件,然后根据需要使用tMap加入列。

我已经修改了一些示例数据,看起来有点像:

|=---+-----------+-----------+-----------+-----------+-----------+-----------+-----------+----------=|
|IN1 |ROW1COLUMN1|xxxxxxx    |ROW1COLUMN3|ROW1COLUMN4|ROW1COLUMN5|xxxxxxx    |xxxxxxx    |ROW1COLUMN8|
|OUT1|xxxxxxx    |ROW1COLUMN2|xxxxxxx    |xxxxxxx    |xxxxxxx    |ROW1COLUMN6|ROW1COLUMN7|xxxxxxx    |
|IN2 |ROW2COLUMN1|xxxxxxx    |ROW2COLUMN3|ROW2COLUMN4|ROW2COLUMN5|xxxxxxx    |xxxxxxx    |ROW2COLUMN8|
|OUT2|xxxxxxx    |ROW2COLUMN2|xxxxxxx    |xxxxxxx    |xxxxxxx    |ROW2COLUMN6|ROW2COLUMN7|xxxxxxx    |
|IN3 |ROW3COLUMN1|xxxxxxx    |ROW3COLUMN3|ROW3COLUMN4|ROW3COLUMN5|xxxxxxx    |xxxxxxx    |ROW3COLUMN8|
|OUT3|xxxxxxx    |ROW3COLUMN2|xxxxxxx    |xxxxxxx    |xxxxxxx    |ROW3COLUMN6|ROW3COLUMN7|xxxxxxx    |
'----+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------'

唯一真正的补充是,现在有一个关键如何在第一列的IN或OUT旁边加入。

首先,您需要使用tMap设置将数据拆分为进出部分:

Split the file using a tMap

根据Id字段是以“IN”还是“Out”开头,这只是根据两条路径之一发送数据。

在此之后,您需要将其与另一个tMap设置重新组合,如:

Recombine the files using a tMap

此连接基于Id文件中提取的密钥,并使用组合输出中的相应列。

不幸的是你不能用tMap拆分流,然后直接将它重新加入到另一个tMap中,所以最好把它输出到两个不同的地方(数据库表或临时CSV文件),然后当它subjob完成然后在那些单独的地方读取并与第二个tMap重新组合。

示例作业可能如下所示:

example Job setup

如果你没有自然键加入,那么你可以通过获取第一个tMap的输出然后添加一个表达式为Numeric.sequence的列作为列的值来生成一个。 / p>