如何从Apache Nifi中的属性提取名称目录?

问题描述

如何在Apache Nifi中提取名称目录? 我想从流文件的“绝对路径属性提取名称,并将其保存为相同流文件属性

例如:absolute.path的值为“ C:\ Users \ 01_SEG \ 2019” 并将它们置于新属性中,例如:year = 2019,time = 01_SEG

我尝试使用“ UpdateAttribute”中的replaceAll函数从“ absolute.path”中提取信息,但无法识别带有()的组。我不知道如何在NiFi中处理正则表达式中的组和NiFi中的属性。 例如,我要删除目录的最后两个名称,但是不起作用。

${'absolute.path':replaceAll('(\\[0-9]{2}_SEG)(\\([0-9]{4}\/)$)','')}

此表达式可在任何Java Regex中使用,但在此处无效。 如果我尝试类似的事情:

time = ${"absolute.path":replaceFirst(".*\\(.*)\\\d{4}","$1")}

有类似以下错误Error

解决方法

UpdateAttribute处理器允许任意新的/现有的属性通过其他属性的表达式语言从regular expression parsing分配值。您的方案示例:

现有属性 absolute.path =“ C:\ Users \ 01_SEG \ 2019”

为以下项添加动态属性:

  • 时间 = ${"absolute.path":replaceFirst(".+\\\\(\\w+)\\\\\\d{4}","$1")}
  • year = ${"absolute.path":replaceFirst(".*(\d{4})$","$1")}

生成的流文件将具有以下属性:

  • absolute.path =“ C:\ Users \ 01_SEG \ 2019”
  • 时间 =“ 01_SEG”
  • year =“ 2019”

表达式中的属性 absolute.path 多余的引号是因为它包含一个.字符。

更新

由于Windows斜线的方向,斜线转义需要加倍。

$1在正则表达式中引用“组1”,因此我们提取该组中包含的内容,然后替换整个匹配项(整个原始值),只包含组的内容。

如果您希望两个表达式都相同,则可以将表达式指定为两个组,并用$1替换一个属性,将$2替换另一个属性。

刚刚在本地环境中运行的输出:

--------------------------------------------------
Standard FlowFile Attributes
Key: 'entryDate'
    Value: 'Wed Oct 07 10:37:39 PDT 2020'
Key: 'lineageStartDate'
    Value: 'Wed Oct 07 10:37:39 PDT 2020'
Key: 'fileSize'
    Value: '0'
FlowFile Attribute Map Content
Key: 'absolute.path'
    Value: 'C:\Users\01_SEG\2019'
Key: 'filename'
    Value: 'b16c325e-6d21-4d54-82f6-971c47152d63'
Key: 'path'
    Value: './'
Key: 'time'
    Value: '01_SEG'
Key: 'uuid'
    Value: 'b16c325e-6d21-4d54-82f6-971c47152d63'
Key: 'year'
    Value: '2019'
--------------------------------------------------