如何在csv文件中的特定单词中找到字符时更换字符

时间:2018-02-07 00:02:24

标签: regex xml pentaho kettle pdi

问题描述: 使用其中一个数据字段中的管道解析csv文件(使用管道符号作为分隔符)。该数据字段将始终位于XML标记中,即(开始标记)和(结束标记)。因此,我希望用一些排除逻辑来解析csv文件,以便在标记中找到分隔符时忽略分隔符。

我的目标是使用Pentaho数据集成工具解析此数据更正的管道分隔文件(如下面的预期结果中所示),以加载到我们的数据库中。在数据更正之后,读取csv文件非常简单。

示例数据:

abc| <evar29> d|e|f</evar29> | ghijk
xxx| yyyy| <evar29>z|z</evar29>

预期结果(&#34; |&#34;在evar29标签内替换为&#34; @@&#34;)

 abc| <evar29> d @@ e @@ f</evar29> | ghijk
xxx| yyyy| <evar29>z @@ z</evar29>

2 个答案:

答案 0 :(得分:1)

对于您的情况:(?<=<evar29>.*)(?=.*</evar29>)\|

一般情况:(?<=<.+?>.*)(?=.*<.+?>)\|

答案 1 :(得分:0)

在阅读了有关sed和awk之后,在这里回答我自己的问题。但是,对于这些标记中多次出现管道字符,这似乎不太适用。我目前正在研究这个问题。感谢任何帮助。

命令:sed -n 's/<evar29>\(.*\)|\(.*\)<\/evar29>/<evar29>\1@@\2<\/evar29>/pg' test.txt 说明:替换evar29标记之间出现的管道符。 在evar29开始标记之后的字符串被分解并使用捕获组捕获,然后使用所需字符(在我的情况下为@@)连接。

替换字符并写入文件的命令如下:

sed -i 's/<evar29>\(.*\)|\(.*\)<\/evar29>/<evar29>\1@@\2<\/evar29>/g' test.txt

希望这有助于任何寻求此类解决方案的人。