如何从 NIFI 中的流文件名称中提取子字符串

How to Extract a substring from a flowfile Name in NIFI

我有一个名为 'test.abcde.houses.csv' 的文件,我想提取子字符串 'abcde',我将在下一个处理器组中使用它来查询数据库。

目前,我正在使用 updateAttribute 处理器组来尝试提取子字符串。

这是我在值部分使用的代码。

var userPattern = java.util.regex.Pattern.compile('(.+?)\.[0-9]{8}-[0-9]{7,9}\..+');
var userMatcher = userPattern.matcher(fileName);
var matchExists = userMatcher.matches();



var user;
var userRemove;



if (matchExists) {
user = userMatcher.group(1);
userRemove = user + ".";
}
else {
throw 'Unable to parse username from file metadata.';
}

问题:

  1. 这是在 NIFI 中从流文件名中提取子字符串的正确方法吗?
  2. 我使用的处理器组是否正确?
  3. 此代码是否适用于 Nifi?

您需要使用 NiFi 表达式语言,这是一种 NiFi 自己的脚本功能,它提供了引用属性、将它们与其他值进行比较以及操纵它们的值的能力。请参考这个official documentation.

UpdateAttribute处理器用于update/derivenew/delete属性。所以需要使用UpdateAttribute里面的Expression Language来操作属性。

示例:

test.abcde.houses.csv - 这是你的文件名,如果你想从文件名中提取 abcde 字符串,那么你可以使用 getDelimitedField 函数(表达式语言字符串函数),如下所示。如果表达式未计算,则 user 属性将具有 empty/null 值。

属性:user(如果已经存在则 update/assign 值,否则创建新属性)

值:${filename:getDelimitedField(2, '.')}abcdefilename 属性值中的第二个 index/position)

Expression Language有Boolean, Conditional, String Manipulation等函数,所以你可以很容易的将你的JS逻辑复制到UpdateAttribute来导出想要的属性值。