从CSV批量导入SQL
我需要将大型CSV文件导入SQL Server。我正在使用这个:
BULK INSERT CSVTest FROM 'c:\csvfile.txt' WITH ( FIELDTERMINATOR = ',', ROWTERMINATOR = '\n' ) GO
问题是我所有的字段都被引号("")包围,所以实际上一行看起来像:
"1","","2","","sometimes with comma , inside", ""
我可以以某种方式批量导入它们并告诉SQL使用引号作为字段定界符吗?
编辑:使用"","作为分隔符,如建议的示例中的问题是:
大多数示例所做的是,他们导入的数据包括第一列中的第一个""和最后一个列中的"最后一个",然后继续进行删除。 my,我的第一列(也是最后一列)是日期时间,并且不允许将" 20080902"作为日期时间导入。
从我一直在阅读的内容来看,我认为FORMATFILE是必经之路,但是文档(包括MSDN)非常无用。
解决方案
尝试`FIELDTERMINATOR ='","'
这是一个很好的链接,可以使用第一个和最后一个引号...看看他如何使用SP的子字符串
http://www.sqlteam.com/article/using-bulk-insert-to-load-a-text-file
我们需要以编程方式执行此操作,还是一次性拍摄?
使用企业管理器,右键单击"导入数据",可以选择定界符。
是的,Richard K是对的:FIELDTERMINATOR ='","'
有关更多信息,请参见http://www.sqlteam.com/article/using-bulk-insert-to-load-a-text-file。
尝试OpenRowSet。这可用于导入Excel内容。 Excel可以打开CSV文件,因此我们只需要找出正确的[ConnectionString] [2]。
[2]:驱动程序= {Microsoft Text Driver(* .txt; * .csv)}; Dbq = c:\ txtFilesFolder ;扩展名= asc,csv,tab,txt;
我们也可以使用DTS或者SSIS。
我们必须小心使用BCP / BULK INSERT,因为如果报价不一致,即使格式文件(甚至XML格式文件都没有提供此选项)和在行首处有假["]字符,BSP或者批量插入都不能很好地处理此问题开头和结尾,并使用[","]作为分隔符。从技术上讲,如果没有嵌入的[,]字符,则CSV文件不需要具有["]字符
因此,有时将逗号分隔文件称为喜剧限制文件。
OpenRowSet将在服务器上需要Excel,并且在64位环境中可能会出现问题,我知道在64位Jet中使用Excel会出现问题。
如果文件将来可能与期望有所不同,SSIS确实是最佳选择。
我们可以控制输入格式吗? | (管道)和\ t通常会带来更好的字段终止符。
我知道这不是一个真正的解决方案,但我使用虚拟表进行导入,并为所有内容设置了nvarchar。然后,我做一个插入,将""字符去掉并进行转换。它虽然不漂亮,但可以完成工作。
如果我们知道如何将文件解析为数据表,则建议使用SqlBulkInsert类将其插入SQL Server。
我们可以尝试此代码,如果我们愿意的话,它非常好,
这将从代码中删除不需要的分号。
例如,如果数据是这样的:
"凯利","雷诺"," [email protected]"
Bulk insert test1 from 'c:.txt' with ( fieldterminator ='","' ,rowterminator='\n') update test1<br> set name =Substring (name , 2,len(name)) where name like **' "% '** update test1 set email=substring(email, 1,len(email)-1) where email like **' %" '**
我有时使用的另一种技巧是在Excel中打开CSV,然后将sql语句写入每行末尾的单元格中。
例如:
=concatenate("insert into myTable (columnA,columnB) values ('",a1,"','",b1,"'")")
填充可以为我们填充到每一行中。然后,只需将输出复制并粘贴到新的查询窗口中即可。
这是古老的做法,但是如果我们只需要偶尔进行一次导入,那么可以避免我们以"正确"的方式阅读所有晦涩难懂的文档。
id表示使用FileHelpers是其开源库