Apache NiFi问题:读取文件后仅保留empnumber列并通过PutFile保存
可行解决方案:提取CSV中的empnumber列并保存
针对你的CSV格式数据,推荐两种高效的NiFi处理方案,替代之前尝试的处理器组合:
方法一:用ConvertRecord处理结构化数据(推荐)
这是NiFi处理CSV这类结构化数据的标准方式,能精准提取指定列:
- 创建并配置CSVReader控制器服务
- 类型选择
CSVReader,设置Header Line Count为1,让Reader自动识别表头;Skip Header Line设为false(如需保留表头可设为true,按需选择)。 - 无需手动填写
Field Names,Reader会从第一行表头自动读取字段名。
- 类型选择
- 创建并配置CSVRecordSetWriter控制器服务
- 类型选择
CSVRecordSetWriter,Include Header Line设为false(不需要输出表头的话)。 - 在
Fields to Write中仅填写empnumber,这样输出只保留该列数据。
- 类型选择
- 配置ConvertRecord处理器
- 选择刚才创建的
CSVReader作为Record Reader,CSVRecordSetWriter作为Record Writer。 - 处理器会自动将输入的CSV转换为仅含empnumber列的内容,之后直接连接PutFile处理器即可保存。
- 选择刚才创建的
方法二:用ReplaceText做文本替换(适合简单场景)
如果不想用Record类处理器,可通过正则替换直接提取目标列:
- 先过滤表头行(可选)
- 添加
RouteOnText处理器,设置Matching Strategy为Contains,Search Value填Empname,将表头行路由到自处理器(或丢弃),只让数据行进入后续处理。
- 添加
- 配置ReplaceText处理器
Search Value填正则表达式:^[^,]+,([^,]+),.*$,该表达式会匹配每行,捕获第二个逗号分隔的字段(即empnumber)。Replacement Value填$1,用捕获到的目标字段替换整行内容。Replacement Strategy选Replace Entire Text,Evaluation Mode选Line-by-Line,确保每行都被正确处理。
- 处理后的流文件内容就是纯empnumber数据,连接PutFile保存即可。
补充:之前用ExtractText未成功的可能原因
ExtractText默认是将提取内容存入属性,而非替换流文件内容。如果要用它,提取后还需配合UpdateContent处理器,把属性值写入流文件的内容字段,才能被PutFile正确保存。
内容的提问来源于stack exchange,提问作者Amarnatha Reddy
相关产品推荐
相关产品推荐

