Talend:相当于 logstash "key value" 过滤器

Talend: Equivalent of logstash "key value" filter

我发现了 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,我没有发现类似的转变。我尝试了 "delimiter file" 工作和其他一些工作但没有成功。

这很棘手也很有趣,因为 Talend 是 schema-based,所以如果您没有预定义 input/output 架构,可能很难实现您想要的。

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

1 - tFileInputRaw,因为如果您不知道您的输入模式,只需使用此模式阅读文件。

2 - tConvertType :在这里你可以将 Object 转换为 String type

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 列作为重组列。

再次希望这对您有所帮助,如果您有动态 input/output 模式,Talend 不是一个非常简单的工具。

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

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