2012-03-20 15 views
2

Maxmind-http://www.maxmind.com/app/geolitecountryからGeoLiteCountry CSVファイルをダウンロードしました。私に与えられたフォーマットを標準として(これが自動化されたタスクになるように)私はすべてのデータをテーブルにインポートしようとしています。Maxmind CSVをSQL Serverにインポートする

私は正確に提供された列に一致する列を持つ新しいテーブル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 

この結果は、挿入単一の行であり、最後のものを除くすべての正しいは、次の行(I制限を持っていなかった場合は、おそらく全体のデータベース)で溢れていました。また、最初のセルには最初は引用がありました。

フォーマットファイルと呼ばれるものがありました。

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ライン上でこのエラー:ように見える作られた1行分の

メッセージ4867、レベル16、状態1、行1
バルクロードデータ変換エラー(オーバーフロー) 1、列3(BeginNum)。

最大エラー数のために10回停止してから停止します。

私はそれをExcelに取り込んで再保存すると、最初のメソッドが機能するようになりました。これによって引用符が削除されました。しかし、私はこれを毎週自動的に更新し、手動で開いて再保存する必要がないので、この方法に頼ってはいけません。

私は最終的に使用する2つの方法のどちらも、クリーンなファイルで動作する限り、気にしません。彼らのドキュメントを見ても、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 
+0

CSVファイルから最初の数行のデータを投稿できますか? – datagod

+0

ああ、私の愚かな私のOPで見つける – Chris

+0

元の一括挿入では、 ''、 ''としてFIELDTERMINATORを指定します。カンマの前後に二重引用符があるのはなぜですか? – datagod

答えて

2

成功。 Searching aroundそして最後にanother forumの助けを借りて私を解決しました。同様の解決策が必要な人には、次のように読んでください。

私はフォーマットファイルメソッドを使用しました。フィールドターミネーターと行ターミネーターを使用できるかどうかはわかりません。

私のSQLコードは次のようになります。私の研究で見つかったよう

CREATE TABLE #TempTable 
(
    DuffColumn varchar(50), 
    FromIP  varchar(50), 
    ToIP  varchar(50), 
    BeginNum bigint, 
    EndNum  bigint, 
    CountryCode varchar(50), 
    CountryName varchar(250) 
) 

BULK 
INSERT #TempTable 
FROM 'c:\Temp\GeoIPCountryWhois.csv' 
WITH 
(
    FORMATFILE = 'C:\Temp\format.fmt' 
) 

INSERT INTO IPCountries2 (FromIP, ToIP, BeginNum, EndNum, CountryCode, Country) 
    SELECT FromIP, ToIP, BeginNum, EndNum, CountryCode, CountryName FROM #TempTable 

、単に最初の引用符をキャプチャし、無駄な列を持っている必要がありました。

マイ形式のファイルは次のようになります。それ以外の場合は、インサートは、数字上の奇数乗算(何かをする、BIGINT、BeginNumとEndNumが両方SQLCHARSとして渡されて、最終的に保存されているにもかかわらず、注意することが

10.0 
7 
1 SQLCHAR  0 1 ""  1 DuffColumn "" 
2 SQLCHAR  0 50 "\",\"" 2 FromIP  "" 
3 SQLCHAR  0 50 "\",\"" 3 ToIP  "" 
4 SQLCHAR  0 19 "\",\"" 4 BeginNum "" 
5 SQLCHAR  0 19 "\",\"" 5 EndNum  "" 
6 SQLCHAR  0 50 "\",\"" 6 CountryCode "" 
7 SQLCHAR  0 250 "\"\n" 7 CountryName "" 

数字ではなくバイトとして読むことについては、私は完全に理解していませんでした)。

それはそれです。このスクリプトを完全に自動化する最後の方法は、古いレコードを消去するためにテーブルを最初に切り捨てることです。しかし、それは誰にも必要ではないかもしれません。

0

このコマンドを試してみてください。

BULK 
INSERT CSVTest 
FROM 'c:\csvtest.txt' 
WITH 
(
    FIELDTERMINATOR = ',', 
    ROWTERMINATOR = '\n' 
) 
GO 

あなたのデータフィールドは、実際に引用符で囲まカンマ、カンマでない終端されています。私がしたすべてはあなたのFIELDTERMINATORから二重引用符を削除しています。

FromIP  varchar(50), 
ToIP   varchar(50), 
BeginNum  varchar(50), 
EndNum  varchar(50), 
CountryCode varchar(50), 
CountryName varchar(250) 

BeginNumとEndNumのためのあなたの元データが実際に文字列ではなく、BIGINTです:私はまた、ステージング/インポートテーブルは、このケースでのようになります。これは、正確にあなたのソースファイルのデータ型と一致して構築示唆しています。このデータはステージングテーブルにインポートすると変換できます。

+0

OPに私のコメントを参照してください、悲しいことに、これは役に立ちません – Chris

1

この記事を使用したばかりです。http://www.webstein.net/blog/importing-maxmind-ip-database-into-sql-server

7分で完了!

BIG THANKS to Raul。

このようなファイルのインポート方法については、他の記事を扱う際に苦労しました。

私がした特別なことは、両方のファイルから最初の行を削除することです。私はNotepad ++を使いました、そしてそれはあまりにも仕事をしました。

+0

あなたは歓迎です:) – ra00l

-1
declare @sql varchar(1000) 
declare @filename varchar(100) = 'C:\Temp\GeoIPCountryWhois.csv' 

set @sql = 
'BULK INSERT geoip FROM ''' + @filename + ''' 
WITH 
(
CHECK_CONSTRAINTS, 
FIELDTERMINATOR = '','', 
ROWTERMINATOR = ''' + char(0x0A) + ''' 
)' 
exec (@sql) 
関連する問題