|
其实这类软件网上已经有很多了,大家要找IP转换在论坛里一搜也有一大把,这里是给大家讲一下如何自己手动来创建自己想要的IP数据库!
本人初学,有不当之处还望高手指点之! 鄙人谢谢先!
如何把“纯真IP库”转换为其它格式呢?过程可能有些复杂,请大家指教!
转换前要具备的工具软件: Microsoft SQL Server 2000 UltraEdit Microsoft Access(想转换为Access格式必需)
转换前要具备的基本知识: 较熟练的使用以上工具!如果你一点都不会,那么下面的文字你看起来就有些费劲了! 如果不会 SQL Server 2000也应该可以,只是效率会很低!
1、先到下载最新的“纯真IP库”,可以到 http://www.cz88.net/fox/ 去下载最新版本。
2、将“纯真IP库”解压,用showip.exe将IP库导出为文本。用UltraEdit打开(千万不要用记事本打开,否则你会后悔的)。 将文本最后几行非IP的部分删掉。 将其中的“,”(英文的逗号)全部替换为“ ”(一个空格),多替换几次,直到出现“搜索的字符串未找到!”为止。 再将其中的“ ”(两个连续的空格),全部替换为“ ”(一个空格),多替换几次,直到出现“搜索的字符串未找到!”为止。 (你可以将其中“ CZ88.NET”的部分也替换掉,不建议这样做。) 保存! 这样就达到了最基本的要求。 (为什么有这一步,直接将它转到Access中不就可以了嘛?如果可以的话我在这里说这么多干什么?)
3、将第二步中得到的文本文件导入到SQL Server 2000中。 文本限定符设为“无” 分隔符选其它,用“ ”(一个空格),这就是我们在第二步中做的。 这样它会生成一张如下结构的表:
|
CREATE TABLE [dbo].[ip] ( [Col001] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL , [Col002] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL , [Col003] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL , [Col004] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL , [Col005] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL , [Col006] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL , [Col007] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL , [Col008] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL , [Col009] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL , [Col010] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL , [Col011] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL ) |
下面这段SQL很重要,否则会出City字段会为Null
|
ALTER TABLE [dbo].[ip] ADD CONSTRAINT [DF_ip_Col001] DEFAULT (' ') FOR [Col001], CONSTRAINT [DF_ip_Col002] DEFAULT (' ') FOR [Col002], CONSTRAINT [DF_ip_Col003] DEFAULT (' ') FOR [Col003], CONSTRAINT [DF_ip_Col004] DEFAULT (' ') FOR [Col004], CONSTRAINT [DF_ip_Col005] DEFAULT (' ') FOR [Col005], CONSTRAINT [DF_ip_Col006] DEFAULT (' ') FOR [Col006], CONSTRAINT [DF_ip_Col007] DEFAULT (' ') FOR [Col007], CONSTRAINT [DF_ip_Col008] DEFAULT (' ') FOR [Col008], CONSTRAINT [DF_ip_Col009] DEFAULT (' ') FOR [Col009], CONSTRAINT [DF_ip_Col010] DEFAULT (' ') FOR [Col010], CONSTRAINT [DF_ip_Col011] DEFAULT (' ') FOR [Col011] GO |
这还不够,我们要计算IP,要将它转换为数字,那么我们还要建一张表:
|
CREATE TABLE [dbo].[Dv_ip] ( [Col001] [varchar] (15) COLLATE Chinese_PRC_CI_AS NULL , [Col002] [varchar] (15) COLLATE Chinese_PRC_CI_AS NULL , [Col003] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL , [Col004] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL , [Col005] [int] NULL , [Col006] [int] NULL , [Col007] [int] NULL , [Col008] [decimal](10, 0) NULL , [Col009] [int] NULL , [Col010] [int] NULL , [Col011] [int] NULL , [Col012] [decimal](10, 0) NULL ) |
(高手可以写存储过程来省去这张表,但我个人认为这样要来的简单)
4、以下的这些就是核心部分了。 要一步一步的执行,不要做一次执行了!
|
/* 查询表Dv_ip,ip中的记录条数 */ select count(*) from Dv_ip select count(*) from ip
/* 光地址就占用了九列,这不是我们要的。 我们将第四列与其它列合并,中间用“ ”(一个空格)连接起来 */ update ip set col004 = col004 + ' ' + col005 + ' ' + col006 + ' ' + col007 + ' ' + col008 + ' ' + col009 + ' ' + col010 + ' ' + col011
/* 这样我们的基础数据就形成了,Dv_ip中的前四列就是了。 下面我们将Dv_ip中的前四列导入到表ip中 */ insert into dv_ip (Col001 , Col002 , Col003 , Col004) select Col001 , Col002 , LTRIM(RTRIM(Col003)) , LTRIM(RTRIM(Col004)) from ip
/* 下面来计算IP */ update dv_ip set col005 = charindex('.',col001,0) update dv_ip set col006 = charindex('.',col001,charindex('.',col001,0)+1) update dv_ip set col007 = charindex('.',col001,charindex('.',col001,charindex('.',col001,0)+1)+1)
update dv_ip set col009 = charindex('.',col002,0) update dv_ip set col010 = charindex('.',col002,charindex('.',col002,0)+1) update dv_ip set col011 = charindex('.',col002,charindex('.',col002,charindex('.',col002,0)+1)+1)
update dv_ip set col008 = CONVERT(decimal,substring(col001,1,col005-1))*16777216 + CONVERT(decimal,substring(col001,col005+1,col006-col005-1))*65536 + CONVERT(decimal,substring(col001,col006+1,col007-col006-1))*256 + CONVERT(decimal,right(col001,len(col001)-col007))-1 update dv_ip set col012 = CONVERT(decimal,substring(col002,1,col009-1))*16777216 + CONVERT(decimal,substring(col002,col009+1,col010-col009-1))*65536 + CONVERT(decimal,substring(col002,col010+1,col011-col010-1))*256 + CONVERT(decimal,right(col002,len(col002)-col011))-1
/* 好了,这样我们就完成了,只要将dv_ip中的col008,col012,col003,col004导出成你所需要的数据格式就可以了。自然也可以导出成Access。 下面附上我写的一个小函数,可以让你的表的结构更合理。 */
select max(dbo.StrBitLen(col003)) as ipmaxlen003 from ip select max(dbo.StrBitLen(col004)) as ipmaxlen004 from ip select max(dbo.StrBitLen(col003)) as dv_ipmaxlen003 from dv_ip select max(dbo.StrBitLen(col004)) as dv_ipmaxlen004 from dv_ip select * from ip where dbo.StrBitLen(col004) = 75 select * from dv_ip where dbo.StrBitLen(col004) = 88
/* 求得字符串的字节长度函数 StrBitLen 参数: @TheStr 要求其长度的字符串 返回值: int 返回字符串的字节长度 */ CREATE FUNCTION StrBitLen (@TheStr varchar(8000)) RETURNS int AS BEGIN declare @StrLen int declare @i int declare @tempstr varchar(2) declare @returnvalue int
set @StrLen = len(@TheStr) set @i = 1 set @tempstr = null set @returnvalue = 0
while(@StrLen>=@i) begin set @tempstr = substring(@TheStr,@i,1) if(ascii(@tempstr)>128 or ascii(@tempstr)<0) begin set @returnvalue = @returnvalue + 2 end else begin set @returnvalue = @returnvalue + 1 end set @i = @i + 1 end return(@returnvalue) END /* StrBitLen 函数结束 */ |
不知道大家看明白了没有,过程显得是有点啰嗦,不过也希望大家能够提出自己的更好的DIY方法,从中享受DIY的乐趣!
利用MS SQL Server可以将数据导出成多种数据格式,包括通用的SQL insert语句,当然常用的数据格式都是没有问题的,如Access,excle,txt,cvs…… 还可以根据你的需要导出你所选择的数据,如某个区段的IP,某个城市的IP 这就要去体验Ms SQL Server的强大功能了
相关下载:http://www.yici.net/content/downinfo/74.html |