当文本限定符后有空格时将 csv 导入 SQLServer

Import csv to SQLServer when there are spaces after the text qualifier

我有一个包含 GeoCodes 列的 csv 文件。这使用 " 作为文本限定符。

我正在尝试使用 SQL 服务器导入向导将其导入 SQL 服务器。 数据的问题是,如果没有 GeoCode,csv 文件有时会将 GeoCode 输出为“”,然后是几个空格。尝试导入数据时出现此错误,因为它在文本限定符中拾取数据,然后在下一个逗号分隔符之前有这些空格。

以下数据示例。 Pontypandy 行是出错的行。

Place      ,Geo Codes           ,Type                          
Northpole  ,"90.0000,0.0000    ",Pole                          
Southpole  ,"-90.0000,0.0000   ",Pole                          
Pyramids   ,"29.9765,31.1313   ",BigTriangle                   
France     ,"                  ",Country                       
Pontypandy ," "                 ,City                          

我必须使用文本限定符,因为 GeoCodes 中有一个逗号。

我无法决定数据是如何发送给我的,因此必须按原样处理数据。

作为解决方法,我必须先在记事本中查找并替换数据,然后再导入。这为工作增加了一个可能不需要的额外步骤。

我是否可以在导入过程中避开 " " 空格

额外说明一下,我目前无法访问 SSIS,但如果可以在那里更轻松地完成,那么请回答这个问题,因为它可以帮助我证明获得 SSIS 的理由(我可能不得不删除此评论稍后如果我必须向我的经理展示它)。

如果您的数据确实如上所示,您可以使用固定宽度格式。按原样导入数据,然后替换 "。这不是最好的解决方案。

好多了:在导入之前通过 sed 对导入文件进行管道传输。这不仅快得多,而且在所有情况下,当数据大于 RAM 时,这是唯一简单的方法(好吧,还有其他一些方法)。您只需要在操作系统级别进行 sed 即可。如果您可以将可执行文件复制到某处,这就是您所需要的。如果要将“[任意数量的空格]”替换为“,则正则表达式应为:

cat myfile.txt|sed -b -e "s/\" *,/\",/">yournewfile.txt

一旦你明白了,正则表达式就很容易了: - s 表示替代, - /first /second/ 表示查找第一个并替换为第二个, - \" 是转义的 "(因为 DOS) - Space 和 * 表示任意数量的空格 - , 表示 ,

在很多系统上 sed 仍然存在 (cygwin)。玩得开心!

批量插入的两种方法

  1. 基于行的批量插入
    • 当您在 CSV 中有字符串限定列时最有用
    • 您需要先创建一个包含两个字段的 table:identity & varchar(max)identity 表示行数,varchar(max) 表示行数据
    • 创建一个仅从上面的 table 中选择 varchar(max) 字段的视图

批量插入语法如下所示:

BULK INSERT AdventureWorks2012.Sales.v_SalesOrderDetail  
FROM 'f:\orders\lineitem.csv'  
    WITH   (  
        ROWTERMINATOR =' |\n'  
    );  
  1. 基于列的插入:
    • 大多数人广泛使用它,但只有在没有字符串限定列时才有用和可靠。
    • 使用带有 RowTerminatorLineTerminator 选项的最常见的批量插入语法

参考文献: