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

时间:2017-09-22 13:42:53

标签: sql-server csv import sql-import-wizard

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

我正在尝试使用SQL Server导入向导将其导入SQLServer。 数据的问题是,如果没有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(我可能不得不删除此评论,如果我必须把它展示给我的经理。

2 个答案:

答案 0 :(得分:1)

如果您的数据真的与上面显示的方式相同,则可以使用固定宽度格式。按原样导入数据并替换“之后。这不是最好的解决方案。”

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

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

一旦你明白了,正则表达式很简单:   - s表示替补,   - / first / second /表示首先查找并替换为second,   - \“是逃脱的”(因为DOS)   - 空格和*表示任意数量的空格   - ,意思,

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

答案 1 :(得分:1)

两种批量插入方法

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

    BULK INSERT AdventureWorks2012.Sales.v_SalesOrderDetail  
    FROM 'f:\orders\lineitem.csv'  
        WITH   (  
            ROWTERMINATOR =' |\n'  
        );  
    
    1. 基于柱状的插入:
      • 大多数人广泛使用它,但只有在没有字符串限定列的情况下才有用且可靠。
      • 将最常用的批量插入语法与RowTerminatorLineTerminator选项
      • 一起使用
    2. 参考文献: