使用VS2022 SSIS导入CSV至数据库时如何处理列内多余逗号
在VS2022 SSIS中处理CSV地址列的多余逗号问题
问题根源
你的CSV文件中Address列包含逗号,但未使用文本限定符包裹,导致平面文件连接管理器将这些逗号识别为列分隔符,拆分出错误的列。此时直接对"Address"列使用REPLACE函数无效,因为原始的Address列已经被截断(比如第一行的Address只读取到了"23 Ave","nue"被当成了额外列);而设置文本限定符为"但CSV中无对应引号,也无法修正列拆分逻辑。
解决方案(无需编辑CSV文件)
方法1:使用派生列转换(纯表达式实现)
步骤1:调整平面文件连接管理器
将平面文件连接管理器的列分隔符设置为一个CSV中不存在的字符(比如|),这样整个CSV行会被读取为单个列,命名为RawData。
步骤2:添加派生列转换,生成正确列
添加派生列转换,创建以下4个派生列:
CustomerKey:
SUBSTRING(RawData, 1, FINDSTRING(RawData, ",", 1) - 1)作用:截取第一个逗号前的内容作为CustomerKey。
Name:
SUBSTRING(RawData, FINDSTRING(RawData, ",", 1) + 1, FINDSTRING(RawData, ",", 2) - FINDSTRING(RawData, ",", 1) - 1)作用:截取第一个逗号和第二个逗号之间的内容作为Name。
CleanAddress:
REPLACE(SUBSTRING(RawData, FINDSTRING(RawData, ",", 2) + 1, LEN(RawData) - FINDSTRING(RawData, ",", 2) - LEN(RIGHT(RawData, FINDSTRING(REVERSE(RawData), ",", 1) - 1)) - 1), ",", " ")作用:截取第二个逗号到最后一个逗号之间的原始Address内容,将其中的逗号替换为空格。
Country:
RIGHT(RawData, FINDSTRING(REVERSE(RawData), ",", 1) - 1)作用:截取最后一个逗号后的内容作为Country。
方法2:使用脚本组件转换(更灵活)
步骤1:同方法1,将整个行读取为RawData列
步骤2:添加脚本组件(转换类型)
- 输入列选择
RawData,添加4个输出列:CustomerKey(字符串类型)、Name(字符串类型)、CleanAddress(字符串类型)、Country(字符串类型)。 - 打开脚本编辑器,选择C#作为脚本语言,编写代码:
public override void Input0_ProcessInputRow(Input0Buffer Row) { if (!Row.RawData_IsNull && !string.IsNullOrEmpty(RawData)) { string rawLine = Row.RawData.Trim(); int firstComma = rawLine.IndexOf(','); int secondComma = rawLine.IndexOf(',', firstComma + 1); int lastComma = rawLine.LastIndexOf(','); // 处理CustomerKey Row.CustomerKey = rawLine.Substring(0, firstComma).Trim(); // 处理Name Row.Name = rawLine.Substring(firstComma + 1, secondComma - firstComma - 1).Trim(); // 处理Address,替换逗号为空格 string rawAddress = rawLine.Substring(secondComma + 1, lastComma - secondComma - 1).Trim(); Row.CleanAddress = rawAddress.Replace(',', ' '); // 处理Country Row.Country = rawLine.Substring(lastComma + 1).Trim(); } }
说明
两种方法均无需修改原始CSV文件,通过先读取完整行再拆分的方式,规避了连接管理器错误拆分列的问题,同时对Address列的逗号进行替换处理。
内容的提问来源于stack exchange,提问作者user24481065
相关产品推荐
相关产品推荐

