SSIS读取无列名~分隔文件 行尾多余~导致列识别异常如何解决
SSIS读取~分隔文件行尾多余分隔符问题解决方案
以下3种方案可按实际场景选择:
方案1:调整连接管理器配置(优先推荐,无需额外代码)
- 打开平面文件连接管理器配置界面,在「常规」选项卡确认列分隔符设为
~,行分隔符按实际文件换行规则选择(通常为{CR}{LF}),取消勾选「第一个数据行作为列名」 - 切换到「高级」选项卡,手动添加与业务固定总列数相等的列,前面所有列的分隔符保持默认继承的
~ - 最后一列的分隔符单独修改为行分隔符(即
{CR}{LF}),保存配置即可
该方案下SSIS会强制按前N个拆分列,行尾所有多余的会和换行符一起作为最后一列的分隔符处理,不会生成额外空列,完全不影响合法空列的识别。
方案2:脚本任务预处理文件(适合分隔符规则复杂的场景)
在数据流任务前新增脚本任务,批量处理待导入文件,裁剪每行多余的分隔符:
- 给脚本任务传入待处理文件路径、输出临时文件路径两个变量
- 选择C#作为开发语言,核心处理逻辑参考如下:
using System.IO; using System.Linq; // 替换为你的实际固定总列数 const int FixedColumnCount = 12; var inputLines = File.ReadAllLines(Dts.Variables["User::InputFilePath"].Value.ToString()); var processedLines = new List<string>(); foreach (var line in inputLines) { if (string.IsNullOrWhiteSpace(line)) continue; var columns = line.Split('~'); // 仅保留前N个列,裁剪末尾多余分隔符生成的空内容 processedLines.Add(string.Join("~", columns.Take(FixedColumnCount))); } File.WriteAllLines(Dts.Variables["User::OutputTempFilePath"].Value.ToString(), processedLines); Dts.TaskResult = (int)ScriptResults.Success;
- 后续数据流直接读取处理后的临时文件即可,可按需配置处理完成后删除临时文件的逻辑。
方案3:数据流脚本组件转换(适合不想修改源文件/连接管理器的场景)
- 保持原有连接管理器配置,先读取所有生成的空列
- 新增「脚本组件」作为数据流转换,输入列选择所有读取到的列,输出列添加与固定总列数相等的业务列
- 在脚本处理逻辑中,按位置取输入列的前N个值赋值给输出列即可,不会过滤掉合法的空值列。
内容的提问来源于stack exchange,提问作者Coda759
相关产品推荐
相关产品推荐

