Я скачал файл GeoLiteCountry
CSV из Maxmind - http://www.maxmind.com/app/geolitecountry. Используя стандартный формат, предоставленный мне (чтобы это могло стать автоматизированной задачей), я пытаюсь импортировать все данные в таблицу.
Я создал новую таблицу 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