Csv ApacheNIFI-使用不同的分隔符处理文本文件

Csv ApacheNIFI-使用不同的分隔符处理文本文件,csv,apache-nifi,Csv,Apache Nifi,我有一个包含以下内容的文本文件 2020-10-19 12:12:00.001;alan;male;{"id":"255","val":"22","type":"1","location":"12530,95823","status":1} 2020-10-19 12:12:00.001;anna;female;{&q

我有一个包含以下内容的文本文件

2020-10-19 12:12:00.001;alan;male;{"id":"255","val":"22","type":"1","location":"12530,95823","status":1}
2020-10-19 12:12:00.001;anna;female;{"id":"256","val":"12","type":"1","location":"12140,25630","status":2}
我想将其转换为csv文件, 首先,由;最后一列需要作为json对象处理并提取其值。输出需要如下所示

date,name,gender,id,val,type,location1,location2,status
2020-10-19 12:12:00.001,alan,male,255,22,1,12530,95823,1
2020-10-19 12:12:00.001;anna,female,256,12,1,12140,25630,2
我是nifi的初学者,我想弄清楚处理器和它们的配置来完成这个转换过程。我尝试了转换记录,只能通过;分隔内容。
如果有人能建议一种方法来完成这一过程,那将是非常有帮助的。

这不是一项容易的任务!但是很有趣

我希望结构没有改变,例如:json列获得更多属性

所以我会这样做:

1-按行拆分文本(一行)-删除标题(如果有)

2-提取文本(创建一个名为
body
的属性,其值为
(?s)(^.*$)

3-使用两个属性更新属性:

  csv = ${body:substringBefore(';{'):replace(';',',')}
   json = ${body:substringAfter(';{')}
4-ReplaceText-并将
{${json}
作为替换值,替换策略:始终替换

5-评估json并提取所有json属性

6-使用此def的Attributestocsv

csv,id,val,type,location,status
7-合并内容-添加标题(您的列名称),分隔符策略=文本和标界符Shift+Enter(换行符)

走了很长的路,可能不是很理想,你可能想看看jolt以获得更好的性能——但我懒得考虑jolt规范:)

我有这个模板-但我不能在这里加载,因为是大的,不能使用任何文件共享服务,所以

另外,如果您手头有一个mysql数据库,您只需将其作为csv加载,并使用json_extract函数即可

SELECT JSON_EXTRACT(name, "$.id") AS name
FROM table 

这不是一项容易的任务!但很有趣

我希望结构没有改变,例如:json列获得更多属性

所以我会这样做:

1-按行拆分文本(一行)-删除标题(如果有)

2-提取文本(创建一个名为
body
的属性,其值为
(?s)(^.*$)

3-使用两个属性更新属性:

  csv = ${body:substringBefore(';{'):replace(';',',')}
   json = ${body:substringAfter(';{')}
4-ReplaceText-并将
{${json}
作为替换值,替换策略:始终替换

5-评估json并提取所有json属性

6-使用此def的Attributestocsv

csv,id,val,type,location,status
7-合并内容-添加标题(您的列名称),分隔符策略=文本和标界符Shift+Enter(换行符)

走了很长的路,可能不是很理想,你可能想看看jolt以获得更好的性能——但我懒得考虑jolt规范:)

我有这个模板-但我不能在这里加载,因为是大的,不能使用任何文件共享服务,所以

另外,如果您手头有一个mysql数据库,您只需将其作为csv加载,并使用json_extract函数即可

SELECT JSON_EXTRACT(name, "$.id") AS name
FROM table 

执行脚本-可能是一个选项。当然-使用python代码执行脚本可能只需一步就可以完成,但您需要脚本,而且我曾尝试在NiFi aloneI中执行脚本,我完全同意。我是给您重点的人;)@Up_one非常感谢您。我花了一些时间来学习和执行这些步骤,在完成所有步骤后,它工作起来非常有魅力。它完成了我的所有要求,并给出了预期的最终输出。再次感谢。如果每一行的格式都是相同的,那么您可以使用GrokReader非常有效地执行脚本-可以选择。当然-使用python代码执行脚本可能只需一步就可以完成,但您需要该脚本,而且我还尝试使用NiFi aloneI绝对同意。我是给你重点的人;)@Up_one非常感谢。我花了一些时间学习和做这些步骤,在我完成所有步骤后,它工作得很有魅力。它完成了我所有的要求,并给出了预期的最终输出。再次感谢你。如果每一行的格式都是一样的,你可以用GrokR来完成艾德效率很高