NiFi:ExtractText中的正则表达式获取CSV标头而不是数据

时间:2017-02-03 10:37:26

标签: csv apache-nifi

我正在处理获取CSV文件的流程。我想根据CSV记录中的第一个字段将记录放入不同的目录。

例如,CSV文件看起来像这样

country,firstname,lastname,ssn,mob_num
US,xxxx,xxxxx,xxxxx,xxxx
UK,xxxx,xxxxx,xxxxx,xxxx
US,xxxx,xxxxx,xxxxx,xxxx
JP,xxxx,xxxxx,xxxxx,xxxx
JP,xxxx,xxxxx,xxxxx,xxxx

我想得到第一个字段的字段值,即country。将这些记录放入特定目录。美国记录转到美国目录,英国记录转到英国目录,依此类推。

我现在的流程是:

GetFile ----> SplitText(行拆分计数= 1&标题行计数= 1)----> ExtractText(line =(。+))----> PutFile(Directory = \ tmp \ data \ $ {line:getDelimitedField(1)})。为了不同的目的,我需要在所有拆分文件中复制头文件。所以我需要它们。

问题是,传入的CSV文件被成功分割成多个流文件。但是,我在ExtractText处理器中给出的正则表达式会根据分割的流文件对其进行评估。 CSV标头而不是记录。因此,不要让美国或英国进入"线"属性,我总是得到" country"。所以所有文件都转到\tmp\data\country。帮我解决这个问题。

1 个答案:

答案 0 :(得分:2)

我相信getDelimitedField只会在单行上运行,并且很可能不会超出拆分文件中的换行符。

我会提倡稍微不同的方法,您可以通过正则表达式更改ExtractText以查找国家/地区代码,并避免将文件内容作为属性包含在内。

使用^.*\n+(\w+)的正则表达式将捕获第一行和第一组单词字符,直到逗号,并将它们放在您在捕获组1中指定的属性名称中。(例如country.1)。< / p>

我已经创建了一个模板,可以在https://github.com/apiri/nifi-review-collateral/blob/master/stackoverflow/42022249/Extract_Country_From_Splits.xml

获取您要查找的值