You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 20:55:28