纯真QQIP库导入到SQL Server详解

相信很多人都是需要通过用户的IP来确认用户是属于哪个区域的,最新的QQIP数据库纯真版20100515,里面的IP数据记录已经达到了:378448条。它收集了包括中国电信、中国移动、中国联通、长城宽带、聚友宽带等 ISP 的最新准确 IP 地址数据。包括最全的网吧数据。本来这个IP库的用意是在QQ上能显示对方的地理位置,在我们的程序中也偶尔有需要的时候,所以把它导入到我们的数据库中成为一张表是非常有必要的。

但是很多人会说这有什么难的呢?但是在实际的操作过程中出现了很多问题,比如:导入到数据库的时候报错;还有就是导入的记录后发现记录数有缺失;导入时无法用,;等字符来区分字段等。下面就让我来告诉你如何成功导入这378448条数据吧。 

 

步骤1

点击上面的下载地址,解压并运行ShowIP.exe,如下图所示

(图1:ShowIP.exe) 

 

步骤2

点击上面的【解压】按钮,保存文件为QQIP.txt

 

步骤3

vim.org中下载gvim72.exe程序,这里为什么需要下载这个文件呢?因为如果使用SQL Server的导入功能导入文件QQIP.txt的话会报错,因为QQIP.txt文件打开一看感觉是使用了制表符/t来区分字段,但是你错了,无论是在SQL Server2000还是在SQL Server2005都无法识别得了,因为它是使用空格来调整的(见图2)。既然无法直接导入,那么我们该如何使用特殊字符来替换这些空格呢?使用SQL Server2000的特定长度也是无法很好的区分开字段。一般的文本工具,比如EMEditor就无法替换指定的空格,因为只能是全文替换,那么当字符是:“我 是 听风吹雨”,这这段字符中的空格也会给替换掉,而我们恰恰是不想见到这样的情况的。vim就可以替换一行中的几个空格。

 

(图2:导入QQIP.txt时无法识别列) 

 

步骤4

下载好gvim72.exe后当然是安装程序啦,安装完毕后打开双击gvim.exe进行操作。选择文件-打开,选择QQIP.txt文件,按住Shift+分号键就可以进行执行命令了,输入“%s//s/+/$/ ”,按回车就会出现图3的效果,这就已经替换了两个字符之间的空格了,一共重复输入3次。 把最下面的字符“IP数据库共有数据$:$378448$条”删除,存盘退出:wq。详解:QQIP.txt有4列。分别是起始ip,结束ip,地区,说明。列之间用不等数量的空格间隔。为了将此文本文件到入到SQL Server,需要处理掉这些空格。但是只能处理掉前3列的空格,最后一列中的空格要保留。vi中输入的命令意思是,把每一行第一个和其连续的空格替换成字符'$'。

 

(图3:第一次执行命令后的效果) 

 

步骤5 

这样就有了一个全新的QQIP.txt了,那么接下来就是导入到数据库中了,因为数据中有些是没有说明这一列的,所以使用SQL Server2000的【其它】中设置为“$”来分隔列,是没有办法做好的。所以这里我们先把整个行做了一列导入到数据中后再使用SQL进行字符串分隔。需要注意的是图5中设置字段长度为500,如果你没有设置导致报错,那么你就要先去数据库中删除这个表,之后再设置字段长度为500并导出,如果你没有删除表,那么会一直报错,因为已经有了这样一个表了,即使最后报错了。

 

(图4:以一列作为导入) 

 

(图5:设置字段长度) 

 

步骤6

现在已经有了一个叫做[QQIPbase]的表了,表的效果如图6所示。使用SELECT count(1) FROM [QQIPbase]发现记录数是378451条,和378448条不相等,再使用DELETE [QQIPbase] WHERE [列 0] =''删除空白行。请确认数据库的记录数是否是:378448条。再执行分析器上执行下面的脚步,这个脚本的作用就是把图6中[列 0]字段的字符进行分隔。

 

(图6:刚导入后的效果图) 

 

--  =============================================
--
 Author:      <听风吹雨>
--
 Create date: <2010/05/27>
--
 Description: <把字符串@str以@split分隔符进行分隔,返回第@index次匹配的元素>
--
 =============================================
CREATE   FUNCTION   [ dbo ] . [ Get_StrArrayStrOfIndex ]
(
  
@str   VARCHAR ( 5000 ),   -- 要分割的字符串
   @split   VARCHAR ( 10 ),   -- 分隔符号
   @index   INT   -- 取第几个元素
)
RETURNS   VARCHAR ( 5000 )
AS
BEGIN
  
DECLARE   @location   INT
  
DECLARE   @start   INT
  
DECLARE   @next   INT
  
DECLARE   @seed   INT
  
SET   @str = LTRIM ( RTRIM ( @str ))
  
SET   @start = 1
  
SET   @next = 1
  
SET   @seed = LEN ( @split )
  
  
SET   @location = CHARINDEX ( @split , @str )
  
WHILE   @location <> 0   and   @index > @next
  
BEGIN
    
SET   @start = @location + @seed
    
SET   @location = CHARINDEX ( @split , @str , @start )
    
SET   @next = @next + 1
  
END
  
IF   @location   = 0   SELECT   @location   = LEN ( @str ) + 1  
  
RETURN   SUBSTRING ( @str , @start , @location - @start )
END

 

步骤7 

执行下面语句进行字符分隔

-- 使用函数Get_StrArrayStrOfIndex进行分隔
select  AllInfo,
dbo.Get_StrArrayStrOfIndex(alls, ' $ ' , 1 as  Start_IP,
dbo.Get_StrArrayStrOfIndex(alls, ' $ ' , 2 as  End_IP,
dbo.Get_StrArrayStrOfIndex(alls, ' $ ' , 3 as  Area,
dbo.Get_StrArrayStrOfIndex(alls, ' $ ' , 4 as  Remark
into  QQIP
from   [ QQIPbase ]

 

步骤8

进行设计表QQIP,对相应的字段设置大小,图7为最后的[QQIP]表效果图。

-- 字段说明
Start_IP  nvarchar ( 16 NULL ,
End_IP  nvarchar ( 16 NULL ,
Area  nvarchar ( 128 NULL ,
Remark  nvarchar ( 512 NULL

(图7:最后的[QQIP]表效果图) 

 

附:缺失数据记录分析 

像下面的数据中说明是没有内容的,所以在插入的时候就会出错,在2000中报错了,一条数据都没有导入,但是在2005其它数据可以导入,出去的就不能了,但是提示的功能也做的比较差,没有记录那些记录是没有导入的。(141490条数据报错) 

202.1.234.0$202.1.235.255$CZ88.NET

202.1.236.0$202.1.236.255$香港$Yahoo公司 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值