2012-03-20 1 views
2

Maxmind - http://www.maxmind.com/app/geolitecountry에서 GeoLiteCountry CSV 파일을 다운로드했습니다. 필자는 표준 형식으로이 형식을 사용하여 (자동화 된 작업이 될 수 있도록) 모든 데이터를 테이블로 가져 오려고 시도하고 있습니다. 내가 찾을 수있는 코드의 다양한 덩어리를, 나는 그것이 필드 종료 및 행 종결를 사용하여 작업을 진행 할 수 없습니다 사용Maxmind CSV를 SQL Server로 가져 오기

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

:

나는 정확히 열을 일치 열이 IPCountries2가 제공하는 새로운 테이블을 생성 이의

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 
+0

CSV 파일에서 처음 몇 줄의 데이터를 게시 할 수 있습니까? – datagod

+0

아, 그래 어떻게 나를 바보, 원래 대량 삽입에 내 영업 – Chris

+0

에서 발견, 당신은 ' ","'와 같은 FIELDTERMINATOR를 지정합니다. 콤마 (,)를 큰 따옴표로 묶는 이유는 무엇입니까? – datagod

답변

2

성공. Searching around 그리고 마지막으로 another forum에서 도움을 얻었습니다. 유사한 솔루션이 필요한 사용자는 다음을 계속 읽으십시오.

필자는 확실하지 않은 fieldterminators 및 행 종결자를 사용할 수 있는지 여부와 상관없이 형식 파일 방법을 사용하여 종료했습니다. 내 연구에서 발견

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 

, 단순히 처음 견적을 캡처 쓸모없는 열이 필요했다 :

내 SQL 코드는 것 같습니다. 그렇지 않으면 삽입이 숫자에 대한 이상한 곱셈을 수행, (뭔가를 결국 모두 SQLCHARS로 전달되는 BIGINT, BeginNum 및 EndNum로 저장에도 불구하고

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에서 따옴표를 제거합니다.BIGINT하지, 실제로 문자열 BeginNum 및 EndNum에 대한

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

소스 데이터 : 나는 또한처럼이 경우 볼 것이다, 준비/임포트 테이블이 정확히 소스 파일의 데이터 유형과 일치 구축 좋습니다. 스테이징 테이블로 데이터를 가져온 후에는이 데이터를 변환 할 수 있습니다.

+0

슬프게도이 당신 천만에요 – Chris

1

방금이 기사를 사용했습니다 : http://www.webstein.net/blog/importing-maxmind-ip-database-into-sql-server.

7 분 안에 완료 !!

큰 감사합니다.

그런 파일을 가져 오는 방법에 대한 다른 기사를 다루면서 많은 고뇌를 덜어 줬습니다.

내가 두 파일의 첫 번째 줄을 삭제한다 한 유일한 여분의 것. 나는 Notepad ++를 사용했고, 그 일 역시했다.

+0

도움이되지 않습니다, 영업에 대한 내 의견을 참조하십시오 하나 (예. BIGINT)를 처리 할 수 ​​없습니다 수 필드에 인용 기호를 삽입하려고하기 때문에 아마도입니다 :) – 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)