设为首页 收藏本站
查看: 868|回复: 0

[经验分享] 纯真QQIP库导入到SQL Server详解

[复制链接]

尚未签到

发表于 2015-6-27 16:04:48 | 显示全部楼层 |阅读模式
  相信很多人都是需要通过用户的IP来确认用户是属于哪个区域的,最新的QQIP数据库纯真版20100515,里面的IP数据记录已经达到了:378448条。它收集了包括中国电信、中国移动、中国联通、长城宽带、聚友宽带等 ISP 的最新准确 IP 地址数据。包括最全的网吧数据。本来这个IP库的用意是在QQ上能显示对方的地理位置,在我们的程序中也偶尔有需要的时候,所以把它导入到我们的数据库中成为一张表是非常有必要的。
  但是很多人会说这有什么难的呢?但是在实际的操作过程中出现了很多问题,比如:导入到数据库的时候报错;还有就是导入的记录后发现记录数有缺失;导入时无法用,;等字符来区分字段等。下面就让我来告诉你如何成功导入这378448条数据吧。
  
  步骤1
  点击上面的下载地址,解压并运行ShowIP.exe,如下图所示

DSC0000.jpg   (图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就可以替换一行中的几个空格。
DSC0001.jpg
  (图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中输入的命令意思是,把每一行第一个和其连续的空格替换成字符'$'。
DSC0002.jpg
  (图3:第一次执行命令后的效果)
  
  步骤5
  这样就有了一个全新的QQIP.txt了,那么接下来就是导入到数据库中了,因为数据中有些是没有说明这一列的,所以使用SQL Server2000的【其它】中设置为“$”来分隔列,是没有办法做好的。所以这里我们先把整个行做了一列导入到数据中后再使用SQL进行字符串分隔。需要注意的是图5中设置字段长度为500,如果你没有设置导致报错,那么你就要先去数据库中删除这个表,之后再设置字段长度为500并导出,如果你没有删除表,那么会一直报错,因为已经有了这样一个表了,即使最后报错了。
DSC0003.jpg
  (图4:以一列作为导入)
DSC0004.jpg
  (图5:设置字段长度)
  
  步骤6
  现在已经有了一个叫做[QQIPbase]的表了,表的效果如图6所示。使用SELECT count(1) FROM [QQIPbase]发现记录数是378451条,和378448条不相等,再使用DELETE [QQIPbase] WHERE [列 0] =''删除空白行。请确认数据库的记录数是否是:378448条。再执行分析器上执行下面的脚步,这个脚本的作用就是把图6中[列 0]字段的字符进行分隔。
DSC0005.jpg
  (图6:刚导入后的效果图)
  


-- =============================================
-- Author:      
-- Create date:
-- Description:
-- =============================================
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 @location0 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 DSC0006.jpg

  (图7:最后的[QQIP]表效果图)
  
  附:缺失数据记录分析
  像下面的数据中说明是没有内容的,所以在插入的时候就会出错,在2000中报错了,一条数据都没有导入,但是在2005其它数据可以导入,出去的就不能了,但是提示的功能也做的比较差,没有记录那些记录是没有导入的。(141490条数据报错)
  202.1.234.0$202.1.235.255$CZ88.NET
  202.1.236.0$202.1.236.255$香港$Yahoo公司

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-80987-1-1.html 上篇帖子: T-SQL Enhancement in SQL Server 2005[下篇] 下篇帖子: 【翻译】SQL Server索引进阶:第一级,索引简介
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表