Apache Nifi:使用更新记录处理器替换列中的值

时间:2019-11-26 09:28:28

标签: csv replace apache-nifi

我有一个csv,看起来像这样:

name,code,age
Himsara,9877,12
John,9437721,16
Razor,232,45

我必须根据一些正则表达式替换列code。我的逻辑显示在下面的Scala代码中。

if(str.trim.length == 9 && str.startsWith("369")){"PROB"}
else if(str.trim.length < 8){"SHORT"}
else if(str.trim.startsWith("94")){"LOCAL"}
else{"INT"}

我使用UpdateRecord处理器替换了code列中的数据。我添加了一个名为/code的属性,其中包含该值。

${field.value:replaceFirst('^[0-9]{1,8}$','SHORT'):replaceFirst('[94]\w+','OFF_NET')}

当用

替换代码时,此有效
  1. 长度小于8且带有“ SHORT”
  2. 从94开始,以“ LOCAL”
  

code列等于8位数字的情况下,我找不到在INT列中的数据,而在以0开头的列中,我却找不到。此外,如何替换数据< strong>如果没有出现上述情况。 (应将数据替换为{{1}}的位置)

希望您可以建议将一个工作流程或值添加到“更新”记录中的属性,以进行上述两种替换。

1 个答案:

答案 0 :(得分:2)

有一个lengthstartsWith函数。

${field.value:length():lt(8):ifElse(
  'SHORT', ${field.value:startsWith(94):ifElse(
  'LOCAL', ${field.value:length():equals(9):and(${field.value:startsWith(369)}):ifElse(
  'PROB', 'INT'
)})})}

我已将换行符放在便于识别的功能上,但应将其删除。

顺便说一句,INT意味着要替换一些字符串值吗?抱歉造成混乱。


好吧,如果仅想使用正则表达式,则可以尝试以下代码。

${field.value
  :replaceFirst('[0-9]{1,8}', 'SHORT')
  :replaceFirst('[94]\w+', 'OFF_NET')
  :replaceFirst('369[0-9]{6}', 'PROB')
  :replace(${field.value}, 'INT')
}