我有一个csv文件,其列值用双引号括起来。
我想使用sql语句从网络路径导入csv文件。
我尝试了批量插入。但它随双引号一起进口。有没有其他方法可以通过忽略文本限定符双引号使用sql语句将csv文件导入SQL Server 2008?
由于 -Vivek
答案 0 :(得分:3)
您可以使用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
答案 1 :(得分:2)
导入带有文本分隔符的文件时,这是一个已知问题,因为bcp / bulk insert实用程序不允许您指定文本分隔符。有关详细讨论,请参阅this link。
答案 2 :(得分:0)
\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
,只需要是最大字段长度,而不是精确的。