如何修复带宽字符支持的BCP文件引发Pentaho数据集成插入首行失败问题
解决BCP导出UTF-16LE文件后Pentaho读取首字段带垃圾字符的问题
这个问题我之前也碰到过,本质是你用BCP的-w参数导出时,文件会以UTF-16LE编码生成,并且开头会添加UTF-16LE的字节顺序标记(BOM,十六进制为FF FE)。Pentaho的CSV输入步骤虽然设置了UTF-16LE,但有时会把这个BOM当成数据的一部分,导致每行第一个字段前出现乱码字符(比如你看到的,这是BOM被误按UTF-8解析后的表现)。
下面给你两种方向的解决方案:
一、在BCP端调整(添加表头或移除BOM)
1. 给导出文件添加表头
BCP本身没有直接添加表头的参数,但可以通过修改查询语句来实现,把表头行和存储过程的结果合并:
bcp "SELECT '字段1名称','字段2名称','字段3名称' UNION ALL exec [companyschema].[collectdataprocedure] %SESSIONID%" queryout collectedoutput.csv -t "," -w -T -S
⚠️ 注意:要确保表头的列数和存储过程返回的列数完全一致,并且数据类型兼容(比如存储过程返回数值型的话,表头字符串会自动转换,或者你可以显式转换存储过程的输出类型来匹配)。如果存储过程返回的是复杂结果集,建议先把结果插入临时表,再查询表头+临时表数据:
bcp "CREATE TABLE #temp (col1 INT, col2 VARCHAR(50)); INSERT INTO #temp exec [companyschema].[collectdataprocedure] %SESSIONID%; SELECT 'col1','col2' UNION ALL SELECT CAST(col1 AS VARCHAR(10)), col2 FROM #temp;" queryout collectedoutput.csv -t "," -w -T -S
2. 移除UTF-16LE的BOM
如果不需要BOM,可以在BCP导出后用PowerShell移除它(批处理里直接调用即可):
# 先执行BCP导出 bcp "exec [companyschema].[collectdataprocedure] %SESSIONID%" queryout collectedoutput.csv -t "," -w -T -S # 用PowerShell移除BOM powershell -Command "(Get-Content 'collectedoutput.csv' -Encoding Unicode) | Set-Content 'collectedoutput.csv' -Encoding Unicode -NoBOM"
这样处理后的文件就没有BOM了,Pentaho读取时不会出现多余字符。
二、在Pentaho端处理(清除BOM字符)
如果不想修改BCP命令,可以在Pentaho转换里直接处理这个BOM:
1. 开启“忽略BOM”选项
部分版本的Pentaho CSV输入步骤在文件选项或编码设置里有“忽略字节顺序标记(BOM)”的勾选框,开启后会自动跳过UTF-16LE的BOM,不需要额外处理。
2. 用替换步骤清除BOM字符
如果没有忽略BOM的选项,可以在CSV输入步骤后添加一个替换字段值步骤:
- 选择需要处理的第一个字段
- 查找内容填写
\uFEFF(这是UTF-16LE BOM对应的Unicode字符) - 替换为空字符串
这样就能把每个首字段开头的BOM字符去掉。
3. 用JavaScript脚本处理
也可以添加一个JavaScript步骤,对第一个字段做判断和截取:
// 替换成你实际的第一个字段名称 var targetField = row.get("your_first_column_name"); // 判断字段开头是否包含BOM字符 if (targetField && targetField.startsWith(String.fromCharCode(0xFEFF))) { // 截取掉第一个字符(BOM) row.set("your_first_column_name", targetField.substring(1)); } // 输出处理后的行 putRow(row);
内容的提问来源于stack exchange,提问作者Eric Downing
相关产品推荐
相关产品推荐

