【问题标题】:Talend: Equivalent of logstash "key value" filterTalend:相当于logstash“键值”过滤器
【发布时间】:2019-07-15 06:32:41
【问题描述】:

我正在发现 Talend Open Source Data Integrator,我想将我的数据文件转换为 csv 文件。

我的数据是一些键值数据集,比如这个例子:

A=0 B=3 C=4
A=2 C=4
A=2 B=4
A= B=3 C=1

我想把它转换成这样的 CSV:

A,B,C
0,3,4
2,,4
2,4,

对于 Logstash,我使用的是 "key value" filter,它只需几行代码就可以完成这项工作。但对于 Talend,我没有发现类似的转变。我尝试了“分隔符文件”作业和其他一些作业,但均未成功。

【问题讨论】:

    标签: talend


    【解决方案1】:

    这是相当棘手和有趣的,因为 Talend 是基于模式的,所以如果您没有预定义输入/输出模式,可能很难实现您想要的。

    这里有一些你可以尝试的东西,有很多组件要使用,我没有设法找到一个组件更少的解决方案。我的解决方案是使用不常见的组件,例如 tNormalizetPivotToColumnsDelimited。有一个缺陷,因为最后你会得到一个额外的列。

    1 - tFileInputRaw,因为如果您不知道您的输入架构,只需使用这个读取文件即可。

    2 - tConvertType :在这里您可以将Object 转换为String 类型

    3 - tNormalize :您必须手动分隔行(使用 \n 作为分隔符)

    4 - tMap :添加一个序列 "I"+Numeric.sequence("s1",1,1) ,这将在以后用于识别和重组行。

    5 - tNormalize :在这里我对“TAB”分隔符进行规范化,为每个 key=value 对获取一行

    6 - tMap :您必须在 "=" 符号上拆分。

    在这一步,您将得到如下输出:

    |seq|key|value|
    |=--+---+----=|
    |I1 |A  |1    |
    |I1 |B  |2    |
    |I1 |C  |3    |
    |I2 |A  |2    |
    |I2 |C  |4    |
    |I3 |A  |2    |
    |I3 |B  |4    |
    '---+---+-----'
    

    其中 seq 是行号。

    7 - 最后,使用 tPivotToColumnDelimited,您将获得结果。不幸的是,您将拥有额外的“ID”列,因为组件 tPivot 提供的输出模式不可编辑。 (实际上,该组件正在创建模式,这在 talend 组件中是非常不寻常的)。 使用 ID 列作为重组列。

    再次希望这会有所帮助,如果您有动态输入/输出架构,Talend 并不是一个非常简单的工具。

    【讨论】:

    • 太棒了!您的方法似乎有效,但我编辑了我的示例,因为我没有看到我可以有空字段。当 Talend 找到一个空字段(如我的示例中的第 4 行 A=)时,((String[])Var.splitContent)[1] 会引发 ArrayIndexOutOfBound 异常,因为数组只有一个元素。我该如何预防?
    • 非常感谢,Corentin。 @iMezouar 会根据您的答案找到优化的解决方案,空数据也不例外。
    【解决方案2】:

    Corentin 的回答非常好,但这是它的增强版,它减少了一些组件:

    我没有使用tFileInputRawtConvertType,而是使用tFileInputFullRow,它将文件逐行读取为字符串。
    我没有手动拆分字符串(需要检查空值),而是使用 tExtractDelimitedFields 和“=”作为分隔符,以便从“key=value”列中提取键和值。
    最终结果是一样的,只是在开头多了一个列。
    如果你想删除该列,一个肮脏的技巧是使用tFileInputFullRow 读取输出文件,并在tReplace 中使用^[^;]+; 之类的正则表达式来替换直到(包括)第一个“; "在带有空字符串的行中,并将结果写入另一个文件。

    【讨论】:

    • 太棒了,这个解决方案可以解决问题!
    猜你喜欢
    • 1970-01-01
    • 2017-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多