QQ纯真IP数据库转换成ACCESS数据库方便ASP使用的办法

其实这类软件网上已经有很多了,大家要找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的强大功能了

from:http://www.yici.net/content/text_all/text_235_1.html

版权声明:
作者:Kiyo
链接:https://www.wkiyo.cn/html/2008-01/i401.html
来源:Kiyo's space
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>