如何在Apache NiFi中使用正则表达式查找指定格式的数字序列?
在Apache NiFi中从CSV文件提取特定格式文本的解决方案
我来帮你搞定这个需求!要从CSV里精准匹配nnnn?nn(4位数字+字面问号+2位数字,比如8764?23)这种格式的内容,用NiFi的正则相关处理器就能轻松实现,下面是具体的操作步骤和细节:
一、选对处理器:优先用ExtractText
如果你的目标是提取匹配到的文本,ExtractText处理器是最直接的选择——它专门用来从FlowFile内容里用正则捞取指定格式的内容。如果需要替换或过滤内容,也可以用ReplaceText,但ExtractText更贴合这个场景。
二、核心配置:正则表达式与参数设置
- 先确保你已经用
GetFile处理器把CSV文件加载到NiFi的数据流中(如果还没做这一步的话)。 - 配置
ExtractText的关键参数:- Regular Expressions:添加正则表达式:
给你拆解下这个正则的逻辑:\d{4}\?\d{2}\d{4}:精准匹配4位0-9的数字\?:匹配字面量的问号(因为问号在正则里是特殊元字符,必须用反斜杠转义)\d{2}:精准匹配2位0-9的数字
- Destination:根据需求选择:
- 选
flowfile-attribute:把提取到的内容存到FlowFile的属性里,方便后续处理器调用 - 选
flowfile-content:直接把FlowFile的内容替换成匹配到的文本,适合只保留目标内容的场景
- 选
- Maximum Matches:如果单条CSV记录里可能有多个匹配项,设置
-1表示匹配所有,或者指定具体数量(比如1只取第一个匹配)
- Regular Expressions:添加正则表达式:
三、进阶:针对特定CSV列提取
如果你的CSV有固定列结构,只想在某一列里查找匹配内容,那可以用更精准的流程:
- 用
ConvertRecord把CSV格式转换成NiFi的Record格式(比如Avro),需要提前配置CSVReader和AvroRecordSetWriter。 - 用
UpdateRecord处理器,在Properties里添加规则:- 目标列名(比如
target_column)对应的Record Path Value设置为:
这个表达式会把目标列里的内容只保留匹配到的${target_column:replaceAll('.*?(\d{4}\?\d{2}).*', '$1')}nnnn?nn格式文本,其他内容去掉。
- 目标列名(比如
四、完整流程示例
一个典型的数据流链路可以是:
GetFile→ 读取指定目录下的CSV文件ExtractText→ 提取匹配的格式文本PutFile→ 把提取结果写入到指定输出目录(或者根据需求换成PutDatabaseRecord等下游处理器)
内容的提问来源于stack exchange,提问作者Jesus
相关产品推荐
相关产品推荐

