在SQL Server中批量插入正确引用的CSV文件
我试图导入正确引用的CSV文件,这意味着数据只有在包含逗号时才被引用,例如:
41, Terminator, Black 42, "Monsters, Inc.", Blue
我观察到,第一行正确导入,但第二行错误以暗示引用逗号的方式被视为字段分隔符。
我见过这样的build议
从SQL CSV批量导入
改变字段终止符
FIELDTERMINATOR = ' “”'
但是,我的CSV文件只引用需要它的字段,所以我不相信这个build议会起作用。
SQL Server的BULK IMPORT语句是否可以导入正确引用的CSV文件? 怎么样?
不幸的是,SQL Server将引用的逗号解释为分隔符。 这适用于BCP和批量插入。
从http://msdn.microsoft.com/en-us/library/ms191485%28v=sql.100%29.aspx
如果数据中出现终止符,则将其解释为终止符,而不是数据,并且将该字符后面的数据解释为属于下一个字段或logging。 因此,仔细select您的终结者,以确保他们永远不会出现在您的数据。
还有另一个解决scheme。
考虑引号作为字段分隔符的一部分,通过编辑fmt文件。
您可以查看更多信息:
以上链接的摘录:
删除引号的唯一方法是修改导入操作中指定的列分隔符。 这里唯一的缺点是,如果你检查要插入的数据,你将很快意识到每列的分隔符是不同的(上面强调的分隔符)。
因此,要为每列指定不同的列分隔符,如果打算使用批量插入或BCP,则需要使用格式文件。 如果您为上述表格结构生成一个格式文件,它将如下所示:
9.0 3 1 SQLCHAR 0 5 "\t" 1 FName SQL_Latin1_General_CP1_CI_AS 2 SQLCHAR 0 5 "\t" 2 LName SQL_Latin1_General_CP1_CI_AS 3 SQLCHAR 0 50 "\r\n" 3 Company SQL_Latin1_General_CP1_CI_AS
修改格式文件以表示每列的正确列分隔符。 要使用的新格式文件将如下所示:
9.0 4 1 SQLCHAR 0 0 "\"" 0 FIRST_QUOTE SQL_Latin1_General_CP1_CI_AS 2 SQLCHAR 0 5 "\",\"" 1 FNAME SQL_Latin1_General_CP1_CI_AS 3 SQLCHAR 0 5 "\",\"" 2 LNAME SQL_Latin1_General_CP1_CI_AS 4 SQLCHAR 0 50 "\"\r\n" 3 COMPANY SQL_Latin1_General_CP1_CI_AS
确保您已启用TextQualified选项并将其设置为“”。
您也可以使用OpenRowSet和CSV文本文件数据提供程序。
这应该是可能的任何版本的SQL Server> = 2005,但您需要启用该function。
我也有同样的问题,我不想去SSIS路由,所以我find了一个很容易运行的PowerShell脚本,并在那个特定的字段中用逗号来处理引号:
源代码和DLL的PowerShell脚本: https : //github.com/billgraziano/CsvDataReader
以下是一个解释使用情况的博客: http : //www.sqlteam.com/article/fast-csv-import-in-powershell-to-sql-server
我有同样的问题,数据只偶尔双引号的文字。 我的解决scheme是让BULK LOAD导入双引号,然后对导入的数据运行REPLACE。
例如:
使用(FIRSTROW = 1,FIELDTERMINATOR =',',ROWTERMINATOR ='\ n')从“F:\ Data \ Map \ CodePointOpen \ Data \ CSV \ ab.csv”批量插入CodePoint_tbl;
更新CodePoint_tbl设置邮政编码=replace(邮政编码,'“','')其中charindex('”',邮政编码)> 0
为了减less编写REPLACE脚本的痛苦,只需要从这样的结果中复制和粘贴你需要的东西:
select C.ColID, C.[name] as Columnname into #Columns from syscolumns C join sysobjects T on C.id = T.id where T.[name] = 'User_tbl' order by 1; declare @QUOTE char(1); set @QUOTE = Char(39); select 'Update User_tbl set '+ColumnName+'=replace('+ColumnName+',' + @QUOTE + '"' + @QUOTE + ',' + @QUOTE + @QUOTE + '); GO' from #Columns where ColID > 2 order by ColID;
我在这个问题上花了半天的时间。 最好使用SQL Server导入和导出数据向导导入。 该向导中有一个设置可以解决这个问题。 详细的截图在这里: https : //www.mssqltips.com/sqlservertip/1316/strip-double-quotes-from-an-import-file-in-integration-services-ssis/谢谢
根据CSV格式规范,如果数据是正确引用的,我认为不重要,只要符合规范即可。 如果执行得当,parsing器应该处理过多的引号。 FIELDTERMINATOR
应该是逗号,而ROWTERMINATOR
是行尾 – 这表示一个标准的CSV文件。 您是否尝试使用这些设置导入数据?
- Eclipse – 无法加载类“org.slf4j.impl.StaticLoggerBinder”
- 为什么我的`git branch -l -a`输出里有`remotes / origin / HEAD – > origin / master`项?