0

获取此 XLS 文件

在此处输入图像描述

然后我将这个 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 仅在数据中存在诸如逗号或 dbl 引号字符之类的特殊字符时才指定列分隔符时,即使这似乎也是合理的。

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

插入图 2

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

在此处输入图像描述

我必须做什么才能让 Excel 和 SSIS 相处融洽?

通常,人们通过使用不太可能出现在数据中的列分隔符来避免该问题,但这并不是真正的解决方案。

我发现如果我从中修改文件

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"

但是,在导入时,SSIS 似乎不喜欢这种方式。如何让 Excel 创建一个 CSV 文件,该文件可能包含任何特殊字符,用作数据中的列分隔符、文本分隔符或行分隔符?没有理由使用 Wikipedia 中指定的方法无法正常工作。这就是我认为旧的 MS DTS 软件包曾经做的事情......

更新:

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

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

Excel 读得很好

在此处输入图像描述

但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.
4

2 回答 2

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中的错误。我鼓励阅读本文的每个人点击上述链接并投票让他们解决这个问题。这是我遇到的最严重的 10 个错误。

于 2012-11-05T22:11:43.083 回答
0

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

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

1|ABC|AB"C|D,E|F|03|3,2

在我看来,你有 3 个选择。

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

或者

  1. 使用管道是你的分隔符。

或者

  1. 在 C# 应用程序中完成所有这些并在代码中构建它。
  2. 您可以将该行发送到 SSIS 中的脚本,并在那里解析和构建您想要的文件。

使用文本限定符和“字符”分隔字段肯定是有问题的。

玩得开心!

于 2012-11-05T20:28:35.233 回答