【发布时间】:2011-04-01 08:48:21
【问题描述】:
我有一个 csv 文件,它的列值用双引号括起来。
我想使用 sql 语句从网络路径导入 csv 文件。
我尝试了批量插入。但它与双引号一起导入。有没有其他方法可以通过忽略文本限定符双引号使用 sql 语句将 csv 文件导入 SQL Server 2008?
谢谢 -Vivek
【问题讨论】:
标签: sql-server sql-server-2008
我有一个 csv 文件,它的列值用双引号括起来。
我想使用 sql 语句从网络路径导入 csv 文件。
我尝试了批量插入。但它与双引号一起导入。有没有其他方法可以通过忽略文本限定符双引号使用 sql 语句将 csv 文件导入 SQL Server 2008?
谢谢 -Vivek
【问题讨论】:
标签: sql-server sql-server-2008
这是导入带有文本分隔符的文件时的一个已知问题,因为 bcp/批量插入实用程序不允许您指定文本分隔符。请参阅this link 进行良好的讨论。
【讨论】:
您可以使用non-xml format file 为每列指定不同的分隔符。对于用双引号括起来并由制表符分隔的值,分隔符可以是\",\"。您必须添加一个初始未使用的列来捕获第一个引号。比如读取这个文件:
"row1col1","row1col2","row1col3"
"row2col1","row2col2","row2col3"
"row3col1","row3col2","row3col3"
你可以使用这个格式文件:
10.0
4
1 SQLCHAR 0 50 "\"" 0 unused ""
2 SQLCHAR 0 50 "\",\"" 1 col1 ""
3 SQLCHAR 0 50 "\",\"" 2 col2 ""
4 SQLCHAR 0 50 "\"\r\n" 3 col3 ""
(第一行的数字取决于SQL Server版本。第二行的数字是要读取的列数。别忘了调整一下。)
bulk insert 命令接受formatfile = 'format_file_path' 参数,您可以在其中指定格式文件。例如:
BULK INSERT YourTable
FROM 'c:\test\test.csv'
WITH (FORMATFILE = 'c:\test\test.cfmt')
这会导致:
select * from YourTable
-->
col1 col2 col3
row1col1 row1col2 row1col3
row2col1 row2col2 row2col3
row3col1 row3col2 row3col3
【讨论】:
update YourTable set col1 = substring(col1,2,len(col1)-2) where col1 like '"%"' 一样删除它们
@Andomar 的回答让我在 99% 的路上遇到了一个非常相似的问题。但是,我发现 SQL Server 2014 无法导入最后一行,因为最后一个字段没有换行符:\r\n。
所以我的格式文件看起来更像:
12.0
4
1 SQLCHAR 0 50 "\"" 0 unused ""
2 SQLCHAR 0 50 "\",\"" 1 col1 ""
3 SQLCHAR 0 50 "\",\"" 2 col2 ""
4 SQLCHAR 0 50 "\"" 3 col3 ""
所以对于我的文件,它有一行字段名称,导入 SQL 变成:
BULK INSERT MyTable
FROM 'C:\mypath\datafile.csv'
WITH (
FIRSTROW = 2,
FORMATFILE = 'C:\mypath\formatfile.cfmt',
ROWTERMINATOR = '\r\n'
)
实际的 CSV 有 40 个字段,因此在 Microsoft's website 上阅读不必写列名(col1 - col40 工作正常)以及每行中的第四个参数很有帮助- 示例中的50,只需要最大字段长度,不精确。
【讨论】: