【发布时间】:2012-04-05 04:07:40
【问题描述】:
我已经从 Maxmind - http://www.maxmind.com/app/geolitecountry 下载了 GeoLiteCountry CSV 文件。使用提供给我的标准格式(以便这可以成为一项自动化任务)我正在尝试将所有数据导入表中。
我创建了一个新表 IPCountries2,其中的列与提供的列完全匹配:
FromIP varchar(50),
ToIP varchar(50),
BeginNum bigint,
EndNum bigint,
CountryCode varchar(50),
CountryName varchar(250)
使用我能找到的各种代码块,我无法使用字段终止符和行终止符让它工作:
BULK
INSERT CSVTest
FROM 'c:\csvtest.txt'
WITH
(
FIELDTERMINATOR = '","',
ROWTERMINATOR = '\n'
)
GO
结果是插入了一行,除了最后一行溢出了下一行(如果我没有限制的话,大概是整个数据库)。此外,第一个单元格的开头有一个引号。
我环顾四周,发现了一个叫做格式文件的东西(从未使用过这些文件)。做了一个看起来像:
10.0
6
1 SQLCHAR 0 50 "," 1 FromIP ""
2 SQLCHAR 0 50 "," 2 ToIP ""
3 SQLBIGINT 0 19 "," 3 BeginNum ""
4 SQLBIGINT 0 19 "," 4 EndNum ""
5 SQLCHAR 0 50 "," 5 CountryCode ""
6 SQLCHAR 0 250 "\n" 6 CountryName ""
但在 bigint 行上出现此错误:
消息 4867,第 16 级,状态 1,第 1 行
第 1 行第 3 列 (BeginNum) 的批量加载数据转换错误(溢出)。
它这样做了 10 次,然后由于最大错误计数而停止。
如果我将第一个方法放入 Excel 并重新保存,我就可以使用它,这会删除引号。但是,我不想依赖这种方法,因为我希望它每周自动更新,而不必手动打开和重新保存。
我不介意最终使用这两种方法中的哪一种,只要它适用于干净的文件即可。我查看了他们的文档,但他们只有 PHP 或 MS Access 的代码。
编辑
CSV 文件中的一些行:
"1.0.0.0","1.0.0.255","16777216","16777471","AU","Australia"
"1.0.1.0","1.0.3.255","16777472","16778239","CN","China"
"1.0.4.0","1.0.7.255","16778240","16779263","AU","Australia"
"1.0.8.0","1.0.15.255","16779264","16781311","CN","China"
"1.0.16.0","1.0.31.255","16781312","16785407","JP","Japan"
"1.0.32.0","1.0.63.255","16785408","16793599","CN","China"
"1.0.64.0","1.0.127.255","16793600","16809983","JP","Japan"
"1.0.128.0","1.0.255.255","16809984","16842751","TH","Thailand"
"1.1.0.0","1.1.0.255","16842752","16843007","CN","China"
"1.1.1.0","1.1.1.255","16843008","16843263","AU","Australia"
"1.1.2.0","1.1.63.255","16843264","16859135","CN","China"
"1.1.64.0","1.1.127.255","16859136","16875519","JP","Japan"
"1.1.128.0","1.1.255.255","16875520","16908287","TH","Thailand"
更新
经过一番坚持,我能够使用原始方法(没有格式文档)使事情正常工作 95%。但是,它稍作改动,看起来像这样:
BULK INSERT IPCountries2
FROM 'c:\Temp\GeoIPCountryWhois.csv'
WITH
(
FIELDTERMINATOR = '","',
ROWTERMINATOR = '"'
)
GO
一切都在正确的字段中,我唯一的问题是在第一列的开头有一个引号。一些示例数据:
FromIP ToIP BeginNum EndNum CountryCode Country
"2.21.248.0 2.21.253.255 34994176 34995711 FR France
"2.21.254.0 2.21.254.255 34995712 34995967 EU Europe
"2.21.255.0 2.21.255.255 34995968 34996223 NL Netherlands
【问题讨论】:
-
你能贴出 CSV 文件的前几行数据吗?
-
啊,我真傻,在我的 OP 中找到
-
在原始批量插入中,您将 FIELDTERMINATOR 指定为 '","'。为什么逗号两边有双引号?
-
如果我不指定引号,我会得到 Msg 4864, Level 16, State 1, Line 1 第 1 行的批量加载数据转换错误(指定代码页的类型不匹配或无效字符) ,第 3 列 (BeginNum)。。大概这是因为它试图将引号符号插入到无法处理的字段中(即 bigint)
标签: sql-server sql-server-2008 tsql csv csv-import