在ExtractText之后合并Apache Nifi中的属性(使用正则表达式)

时间:2018-02-21 16:53:08

标签: apache-nifi

使用Nifi ExtractText处理器使用正则表达式从流文件内容中提取匹配项(使用多种捕获模式)后,您将获得一系列数字升序属性。例如。 date,date.0,date.1,date.2,...表示整个文本中的多个捕获。

我想要的是单个属性$ {dates},其中包含捕获的每个条目。有人可以帮忙吗?

(Nifi v1.5.0)

3 个答案:

答案 0 :(得分:1)

使用更新属性处理器 使用表达式语言添加新属性

<强>日期:

${allMatchingAttributes("date.*"):join(",")}

此表达式将所有日期,日期0,日期1,日期2和日期属性添加到流文件中。

更多参考: -

https://nifi.apache.org/docs/nifi-docs/html/expression-language-guide.html#join

答案 1 :(得分:0)

date.0属性是您可能感兴趣的内容。

例如,我使用GenerateFlowFile处理器创建了包含文本This is a message generated at ${now():format('yyyy/MM/dd HH:mm:ss.SSS Z')}的流文件,这将导致内容如This is a message generated at 2018/02/21 09:25:16.832 -0800.

然后我使用ExtractText处理器和一个名为date的新属性,其中包含以下正则表达式:(\d{4}/\d{2}/\d{2}) (\d{2}:\d{2}:\d{2}\.\d{3}) .?\d{4}您可以看到它有两个捕获组 - 一个用于年/月/日部分和一个小时/分钟/秒/毫克部分。

运行ExtractText后,结果就是这样。您可以看到各个捕获组位于date.1date.2中,但date.0包含整个正则表达式匹配。

--------------------------------------------------
Standard FlowFile Attributes
Key: 'entryDate'
    Value: 'Wed Feb 21 09:25:16 PST 2018'
Key: 'lineageStartDate'
    Value: 'Wed Feb 21 09:25:16 PST 2018'
Key: 'fileSize'
    Value: '62'
FlowFile Attribute Map Content
Key: 'date'
    Value: '2018/02/21'
Key: 'date.0'
    Value: '2018/02/21 09:25:16.832 -0800'
Key: 'date.1'
    Value: '2018/02/21'
Key: 'date.2'
    Value: '09:25:16.832'
Key: 'filename'
    Value: '813454866687188'
Key: 'firstName'
    Value: 'Andy'
Key: 'fullName'
    Value: ' '
Key: 'lastName'
    Value: 'LoPresto'
Key: 'path'
    Value: './'
Key: 'uuid'
    Value: '9e5de17c-2d62-401e-ad13-d49adf5fdd85'
--------------------------------------------------
This is a message generated at 2018/02/21 09:25:16.832 -0800.

答案 2 :(得分:0)

您可以使用getDelimitedField表达式语言获取这些值。

如果要捕获流文件内容,请使用ExtractText处理器,在其自身中创建具有以下正则表达式的新属性。

FileSystem.downloadAsync(
  attachment.imageUrl,
  FileSystem.cacheDirectory + attachment.fileName
)

如果您有以下内容

dates:(.*)

它将存储在名为日期的属性中,您可以通过 $ {dates}

在流程中使用它

如果你想让这些值使用下面的表达式,那就是自我。

使用更新属性来捕获如下所示的值。

1,Hi,23,001

您可以像ID :${dates:getDelimitedField(1)} Name:${dates:getDelimitedField(2)} Age:${dates:getDelimitedField(3)}

一样在流程中使用它

希望这对你有用。