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 架构,可能很难实现您想要的。
这里有一些你可以尝试的东西,有很多组件可以使用,我没能找到一个组件更少的解决方案。我的解决方案是使用不寻常的组件,例如 tNormalize
和 tPivotToColumnsDelimited
。有一个缺陷,因为你最后会得到一个额外的专栏。
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 的回答非常好,但这是它的增强版本,它减少了一些组件:
我没有使用 tFileInputRaw
和 tConvertType
,而是使用了 tFileInputFullRow
,它将文件逐行读取为字符串。
我没有手动拆分字符串(需要检查空值),而是使用 tExtractDelimitedFields
和“=”作为分隔符,以便从“key=value”列中提取键和值。
最终结果是一样的,只是在开头多了一个列。
如果你想删除该列,一个肮脏的技巧是使用 tFileInputFullRow
读取输出文件,并在 tReplace
中使用像 ^[^;]+;
这样的正则表达式来替换任何直到(和包括)第一个“;”在带有空字符串的行中,并将结果写入另一个文件。
我发现了 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 架构,可能很难实现您想要的。
这里有一些你可以尝试的东西,有很多组件可以使用,我没能找到一个组件更少的解决方案。我的解决方案是使用不寻常的组件,例如 tNormalize
和 tPivotToColumnsDelimited
。有一个缺陷,因为你最后会得到一个额外的专栏。
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 的回答非常好,但这是它的增强版本,它减少了一些组件:
我没有使用 tFileInputRaw
和 tConvertType
,而是使用了 tFileInputFullRow
,它将文件逐行读取为字符串。
我没有手动拆分字符串(需要检查空值),而是使用 tExtractDelimitedFields
和“=”作为分隔符,以便从“key=value”列中提取键和值。
最终结果是一样的,只是在开头多了一个列。
如果你想删除该列,一个肮脏的技巧是使用 tFileInputFullRow
读取输出文件,并在 tReplace
中使用像 ^[^;]+;
这样的正则表达式来替换任何直到(和包括)第一个“;”在带有空字符串的行中,并将结果写入另一个文件。