当文本限定符后有空格时将 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)。玩得开心!
批量插入的两种方法
- 基于行的批量插入
- 当您在 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'
);
- 基于列的插入:
- 大多数人广泛使用它,但只有在没有字符串限定列时才有用和可靠。
- 使用带有
RowTerminator
和 LineTerminator
选项的最常见的批量插入语法
参考文献:
我有一个包含 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)。玩得开心!
批量插入的两种方法
- 基于行的批量插入
- 当您在 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'
);
- 基于列的插入:
- 大多数人广泛使用它,但只有在没有字符串限定列时才有用和可靠。
- 使用带有
RowTerminator
和LineTerminator
选项的最常见的批量插入语法