【问题标题】:Talend - Merge two rows of a Delimited file to get one single registerTalend - 合并分隔文件的两行以获得一个寄存器
【发布时间】:2014-01-23 15:47:39
【问题描述】:

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

现在,我有一个文件,我必须在其中合并每两行,以获取有关单个寄存器(数据库表的一行)的信息 - 第 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

【问题讨论】:

    标签: parsing rows talend csv


    【解决方案1】:

    您可以尝试将文件分成两种类型的行,然后使用 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 将数据拆分为输入和输出部分:

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

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

    这基于从 Id 文件中提取的键进行连接,并在组合输出中使用适当的列。

    不幸的是,您不能使用 tMap 拆分流,然后直接将其重新加入另一个 tMap,因此最好的办法是将其输出到两个单独的位置(数据库表或临时 CSV 文件),然后当subjob 完成,然后在这些单独的地方读取并与第二个 tMap 重新组合。

    示例作业可能如下所示:

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

    【讨论】:

    • 但是我必须保存这两种“类型”的文件吗?
    • 我已经编辑了我的答案,以展示如何完成它的演练。这需要根据您的实际数据进行调整,但应该让您对需要做什么有一个很好的了解。
    • 非常感谢您的解释。这行得通!
    猜你喜欢
    • 2014-02-18
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    相关资源
    最近更新 更多