使用Excel创建包含特殊字符的CSV文件,然后使用SSIS将其导入数据库

时间:2012-11-05 20:06:45

标签: sql-server-2008 ssis

获取此XLS文件

enter image description here

然后我将此XLS文件另存为CSV,然后使用文本编辑器将其打开。这就是我所看到的:

Col1,Col2,Col3,Col4,Col5,Col6,Col7
1,ABC,"AB""C","D,E",F,03,"3,2"

我看到C列中的双引号字符存储为AB""C,列值用引号括起来,数据中的双引号字符替换为2个双引号字符,表示引号是发生在数据中而不是终止列值。我还看到列G的值3,2用引号括起来,这样就可以清楚地看到逗号出现在数据中而不是指示一个新列。到目前为止,非常好。

我有点惊讶所有的列值都没有用引号括起来,但是当我假设EXCEL只在数据中存在commad或dbl引号字符等特殊字符时指定列分隔符时,这似乎是合理的。

现在我尝试使用SQL Server导入csv文件。请注意,我将双引号字符指定为文本限定符字符。

Insert figure 2

命令char作为Column分隔符。但请注意,SSIS错误地导入了第3列,例如,没有将两个连续的双引号字符翻译为双引号字符的单个出现。

enter image description here

我需要做些什么才能让Excel和SSIS相处融洽?

通常人们通过使用在数据中很少发生的列分隔符chactacter来避免这个问题,但这不是一个真正的解决方案。

我发现如果我从这个

修改文件
Col1,Col2,Col3,Col4,Col5,Col6,Col7
1,ABC,"AB""C","D,E",F,03,"3,2"

......对此:

Col1,Col2,Col3,Col4,Col5,Col6,Col7
1,ABC,"AB"C","D,E",F,03,"3,2"

,即删除C列值中的两个连续引号,表示数据已正确加载,但这对我来说有点混乱。首先,SSIS如何确定B和C之间的双引号不会终止该列值?是因为以下字符不是逗号列分隔符或行分隔符(CRLF)?为什么Excel以这种方式导出它?

根据Wikipedia,以下是CSV文件的几个特征:

  1. 包含换行符(CRLF),双引号和逗号的字段    应该用双引号括起来。例如:

    “aaa”,“b CRLF    bb“,”ccc“CRLF    ZZZ,YYY,XXX

  2. 如果使用双引号括起字段,则使用双引号    出现在一个字段内必须通过前面的方式进行转义    另一个双引号。例如:

    “AAA”, “B”, “BB”, “CCC”

  3. 然而,看起来SSIS在导入时并不喜欢它。如何让Excel创建一个CSV文件,该文件可能包含在数据中用作列分隔符,文本分隔符或行分隔符的任何特殊字符?没有理由使用维基百科中指定的方法无法工作。这就是我认为旧的MS DTS包用来做...

    更新

    如果我使用记事本将输入文件更改为

    Col1,Col2,Col3,Col4,Col5,Col6,Col7,Col8
    "1","ABC","AB""C","D,E","F","03","3,2","AB""C"
    

    Excel读得很好

    enter image description here

    但SSIS返回

    The preview sample contains embedded text qualifiers ("). The flat file parser does not support embedding text qualifiers in data. Parsing columns that contain data with text qualifiers will fail at run time.
    

2 个答案:

答案 0 :(得分:1)

结论:

就像更新中的错误消息一样......

The flat file parser does not support embedding text qualifiers in data. Parsing columns that contain data with text qualifiers will fail at run time.

Microsoft Connect中确认的错误。我鼓励所有阅读本文的人点击上述链接并投票让他们修复这个臭味。这是我遇到过的最令人震惊的错误中的前十名。

答案 1 :(得分:0)

您是否需要使用逗号分隔符。

我使用了一个没有Text限定符的管道分隔符,它工作正常。这是我输出的文本文件。

1 | ABC | AB“C | d,E | F | 03 | 3,2

我认为你有3个选择。

  1. 将数据读入舞台表格。
  2. 在列
  3. 上运行您需要的任何更新查询
  4. 现在从舞台表中选择您的数据并将其输出到平面文件。
  5. OR

    1. 使用管道是分隔符。
    2. OR

      1. 在C#应用程序中执行所有操作并使用代码构建它。
      2. 您可以将该行发送到SSIS中的脚本并解析并构建您想要的文件。
      3. 使用文本限定符和“字符”分隔字段肯定存在问题。

        玩得开心!