Talend:相当于logstash“;“关键值”;滤波器

Talend:相当于logstash“;“关键值”;滤波器,talend,Talend,我正在发现Talend开源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,我使用的是能够用几行代码完成这项工作的。但对于泰伦德,我没有发现类似的转变。我尝试了一个“delimiter file”作业和其他一些作业,但没有成功。这是一个非常棘手和有趣的问题,因

我正在发现Talend开源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,我使用的是能够用几行代码完成这项工作的。但对于泰伦德,我没有发现类似的转变。我尝试了一个“delimiter file”作业和其他一些作业,但没有成功。

这是一个非常棘手和有趣的问题,因为Talend是基于模式的,因此如果没有预定义输入/输出模式,则很难实现您想要的

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

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

2-
t转换类型
:在这里您可以将
对象
转换为
字符串
类型

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

4-
tMap
:添加一个序列
“I”+数字序列(“s1”,1,1)
,这将在以后用于识别和重新组合行

5-
t规范化
:这里我对“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-最后,使用tpivottocolumn分隔符,您将得到结果。不幸的是,您将有额外的“ID”列,因为组件tPivot提供的输出模式是不可编辑的。(实际上,组件正在创建模式,这在talend组件中非常罕见)。 使用ID列作为重组列


希望这也能有所帮助,如果你有动态输入/输出模式,Talend不是一个很容易的工具。

Corentin的答案很好,但这里有一个增强版,它减少了一些组件:

我没有使用
tFileInputRaw
tConvertType
,而是使用
tFileInputFullRow
,它将文件逐行读取为字符串。
我使用带“=”的
tExtractDelimitedFields
作为分隔符,从“key=value”列中提取一个键和一个值,而不是手动拆分字符串(需要检查空值) 最终结果相同,在开始处有一个额外的列。

如果您想删除该列,一个棘手的问题是使用
tFileInputFullRow
读取输出文件,并使用类似于
^[^;]+的正则表达式
tReplace
中,用空字符串替换行中最多(包括)第一个“;”的任何内容,并将结果写入另一个文件。

太棒了!您的方法似乎有效,但我编辑了我的示例,因为我没有看到可以有空字段。当Talend找到一个空字段(如我的示例中的第4行
a=
)时,
((String[])Var.splitContent)[1]
抛出一个
ArrayIndexOutOfBound
异常,因为数组只有一个元素。我该怎么预防呢?多谢你,科伦丁@iMezouar会根据您的答案找到一个优化的解决方案,不会再出现空数据异常。太棒了,这个解决方案可以解决问题!