从CSV读取稀疏列

时间:2013-02-01 22:20:29

标签: sql csv ssis

我得到一个我需要读入SQL表的CSV。现在它是通过Web应用程序手动上传的,但我想将其移到SQL服务器中。我没有直接将我的导入脚本移植到SSIS中的脚本中,而是想查看是否有更好的方法来实现它。

此特定CSV的问题在于前几列是已知的,并且具有适当的标头。但是,在该组之后,其余列都是稀疏填充的,甚至可能没有标题。

示例:

Col1,Col2,Col3,,,,,,
value1,value2,value3,,value4
value1,value2,value3,value4,value5
value1,value2,value3,,value4,value5
value1,value2,value3,,,value4

使这种情况可以忍受的是,Col3之后的所有内容都可以连接在一起。该脚本检查这些尾随列的每一行,并将它们放在一个“misc”列中。它必须采用一种盲目方法,因为无法提前知道这些列中有多少列。

有没有办法使用SSIS工具执行此操作,还是应该将现有导入脚本移植到SSIS脚本任务?

2 个答案:

答案 0 :(得分:0)

SSIS之外的另一个选择是使用BulkInsert和格式文件。

格式文件允许您描述传入数据的格式。

例如......

9.0
4
1       SQLCHAR       0       100     ","      1     Header1      SQL_Latin1_General_CP1_CI_AS
2       SQLCHAR       0       100     ","      2     Header2      SQL_Latin1_General_CP1_CI_AS
3       SQLCHAR       0       100     ","      3     Header3      SQL_Latin1_General_CP1_CI_AS
4       SQLCHAR       0       100     "\r\n"   4     Misc         SQL_Latin1_General_CP1_CI_AS

批量插入>> http://msdn.microsoft.com/en-us/library/ms188365.aspx

格式文件>> http://msdn.microsoft.com/en-us/library/ms178129.aspx

答案 1 :(得分:0)

步骤0.我的测试文件附加一行

Col1,Col2,Col3,,,,,,
value1,value2,value3,,value4
value1,value2,value3,value4,value5
value1,value2,value3,,value4,value5
value1,value2,value3,,,value4
ends,with,comma,,,value4,
  1. 在控制流表面上拖动DFT
  2. 在DFT内部,在数据流表面上,拖动平面文件源
  3. 让我们自己开始映射。检查第一个数据行中的列名称。
  4. 您将看到Col1,Col2,Col3,它们是您已知的字段。
  5. 您还会看到第3列到第8列。这些是列 需要集中到一个Misc列中。

  6. 转到Flat File Manager Editor的“高级”部分。

  7. 将第3列重命名为其他。将字段大小设置为4000。

    注意:如果时间长于此值,则需要使用文本数据类型。 这将带来一些挑战,所以要准备好开心; - )

  8. 删除第4列到第8列。 现在添加一个脚本组件。 输入列 - 仅选择其他字段。用法类型:ReadWrite 代码:

  9. public override void Input0_ProcessInputRow(Input0Buffer Row)

        {
            string sMisc = Row.Misc;
    
    
            string sManipulated = string.Empty;
            string temp = string.Empty;
    
            string[] values = sMisc.Split(',');
    
            foreach (string value in values)
            {
                temp = value;
    
                if (temp.Trim().Equals(string.Empty))
                {
                    temp = "NA";
                }
    
                sManipulated = string.Format("{0},{1}", sManipulated, temp);
            }
    
            Row.Misc = sManipulated.Substring(1); 
        }
    

    - 目的地。 与平常没什么不同。

    希望我理解你的问题,解决方案适合你。