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

Siv*_*man 5 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
Run Code Online (Sandbox Code Playgroud)

我想获取第一个字段(即国家/地区)的字段值。将这些记录放入特定目录。美国记录进入美国目录,英国记录进入英国目录,依此类推。

我现在的流程是:

GetFile----> SplitText(行拆分计数= 1&标题行计数= 1)----> ExtractText(行=(。+))----> PutFile(目录= \ tmp \ data \ $ {line:getDelimitedField( 1)})。我需要将头文件跨所有拆分文件复制,以达到不同的目的。所以我需要他们。

关键是,传入的CSV文件被成功拆分为多个流文件,并且标头成功。但是,我在ExtractText处理器中给出的正则表达式将根据拆分后的流文件的CSV标头(而不是记录)对它进行评估。因此,我总是得到“国家”而不是使美国或英国进入“行”属性。因此,所有文件都转到\tmp\data\country。帮我解决这个问题。

api*_*iri 3

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

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

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

我创建了一个模板,应该可以获取您正在寻找的值:https://github.com/apiri/nifi-review-collat ​​eral/blob/master/stackoverflow/42022249/Extract_Country_From_Splits.xml