获取此 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 文件。请注意,我将双引号字符指定为文本限定符字符。
和一个命令字符作为列分隔符。但是,请注意 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 文件的几个特征:
包含换行符 (CRLF)、双引号和逗号的字段应该用双引号括起来。例如:
"aaa","b CRLF bb","ccc" CRLF zzz,yyy,xxx
如果使用双引号将字段括起来,则出现在字段内的双引号必须通过在其前面加上另一个双引号来进行转义。例如:
"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.