如何在Apache NiFi中跳过CSV文件前9行并读取内容
在Apache NiFi中跳过CSV前9行的实现方法
下面是几种实用的实现方式,根据你的场景选择即可:
方法一:使用ReplaceText处理器(最简单高效)
这是处理小到中等大小CSV文件的首选方案,通过正则匹配直接移除前9行:
- 添加并配置
ReplaceText处理器:- Search Value:填入正则表达式
^([^\n]*\n){9},该表达式会匹配文件开头的9行内容(包含每行末尾的换行符) - Replacement Value:留空(表示删除匹配到的内容)
- Search Mode:选择
Replace First(只替换一次开头的9行,避免误删中间内容) - Regular Expression Engine:保持默认的
Java即可
- Search Value:填入正则表达式
处理后,流文件中就只剩下第10行及以后的CSV内容。
方法二:拆分+过滤+合并(适合需单独处理每行的场景)
如果需要对每行做额外处理,可通过拆分-过滤-合并的流程实现:
- 添加
SplitText处理器,将Line Split Count设为1,把CSV文件拆分为单个行的流文件 - 添加
UpdateAttribute处理器,添加属性line.number,值设为${split.index + 1}(给每行分配从1开始的行号) - 添加
RouteOnAttribute处理器,创建路由规则keep_lines,表达式为${line.number:gt(9)},将行号大于9的流文件路由到成功关系 - 添加
MergeContent处理器,将过滤后的单行流文件重新合并为完整的CSV文件,需配置Delimiter Strategy为Text,Header留空,Footer留空,Delimiter设为\n
方法三:使用ExecuteScript处理器(自定义逻辑)
如果需要更灵活的控制,可通过脚本直接处理内容,以Groovy脚本为例:
添加ExecuteScript处理器,将Script Language设为Groovy,填入以下脚本:
def flowFile = session.get() if (!flowFile) return flowFile = session.write(flowFile, { inputStream, outputStream -> def reader = new BufferedReader(new InputStreamReader(inputStream)) // 跳过前9行 9.times { reader.readLine() } // 写入剩余内容 String line while ((line = reader.readLine()) != null) { outputStream.write((line + System.lineSeparator()).getBytes()) } } as StreamCallback) session.transfer(flowFile, REL_SUCCESS)
该脚本会直接读取流文件内容,跳过前9行后将剩余内容写入新的流文件。
内容的提问来源于stack exchange,提问作者BHADRAKA HERATH
相关产品推荐
相关产品推荐

