问题描述
如何在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")}
解决方法
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'
--------------------------------------------------