在Apache NiFi中将CSV文件表头转为大写并保留特殊字符的实现咨询
Apache NiFi CSV表头转大写实现方案
以下两种方案都可实现仅将CSV第一列表头全转为大写、保留表头特殊字符、其余业务数据无改动的需求,适配示例中的分号分隔CSV,也兼容其他分隔符格式的CSV文件。
方案一:使用ReplaceText处理器(无需写代码,推荐常规场景使用)
直接配置正则和表达式语言即可完成处理,配置步骤如下:
- 新增
ReplaceText处理器,和上游的CSV文件读取节点(如GetFile、FetchFile等)建立连接 - 按以下参数配置处理器:
Search Value:填写^([^\n\r]+),正则作用是匹配文件第一行的全部内容Replacement Value:填写${'$1':toUpperCase()},调用NiFi表达式语言将匹配到的第一行内容全转大写,原有特殊字符会原样保留Character Set:选择和你CSV文件匹配的编码,常用为UTF-8Maximum Buffer Size:填写大于你待处理的最大CSV文件的数值即可,例如最大文件为20MB则填20 MBReplacement Strategy:选择Regex ReplaceEvaluation Mode:选择Entire text
- 配置完成后启动处理器即可生效,可先使用测试文件验证输出结果符合预期后再全量运行。
方案二:使用ExecuteScript处理器(适配表头含换行等复杂CSV场景)
如果你的CSV表头存在换行等特殊格式,正则匹配可能不准确,可使用Groovy脚本实现逐行处理:
- 新增
ExecuteScript处理器,和上游CSV读取节点建立连接 - 处理器基础配置:
Script Engine选择Groovy - 在
Script Body输入框中填入以下代码:
def flowFile = session.get() if (!flowFile) return try { flowFile = session.write(flowFile, { inputStream, outputStream -> // 可修改此处编码适配你的CSV文件,比如GBK编码改为"GBK" def reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8")) def writer = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8")) // 读取第一行表头转大写后输出 def header = reader.readLine() if (header != null) { writer.write(header.toUpperCase()) writer.newLine() } // 剩余业务行原样输出 def line while ((line = reader.readLine()) != null) { writer.write(line) writer.newLine() } writer.flush() } as StreamCallback) session.transfer(flowFile, REL_SUCCESS) } catch (Exception e) { session.transfer(flowFile, REL_FAILURE) }
- 配置完成后启动处理器即可。
内容的提问来源于stack exchange,提问作者l rf
相关产品推荐
相关产品推荐

