0

我有一个包含 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 的合理性(如果必须,我可能需要稍后删除此评论出示给我的经理)。

4

2 回答 2

1

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

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

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

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

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

于 2017-09-22T14:37:54.107 回答
1

批量插入的两种方法

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

批量插入语法看起来像这样:

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

参考:

于 2017-09-22T14:40:14.020 回答