|
cz1314
初级用户
积分 64
发帖 43
注册 2007-11-12
状态 离线
|
『楼 主』:
[已结]对ip段的整合,涉及超多次比较!
现有一个文本ip.txt 是美国的ip段列表共有30万条。
-----------txt--------------------------------------------
ip1 ip2 国家
3.0.12.0 3.0.12.255 United states
3.0.13.0 3.0.14.255 United states
3.0.15.0 3.0.15.255 United states
3.0.16.0 3.0.103.255 United states
3.0.104.0 3.0.104.255 United states
3.0.105.0 3.0.117.255 United states
3.0.118.0 3.0.118.255 United states
3.0.119.0 3.0.229.255 United states
3.0.230.0 3.0.230.255 United states
3.0.231.0 3.0.255.255 United states
3.2.0.0 3.2.2.255 United states
3.2.3.0 3.2.3.255 United states
... ...
... ...
85.32.145.144 85.32.145.151 United states
85.32.145.152 85.32.145.175 United states
85.35.145.200 85.35.145.207 United states
85.35.145.208 85.35.145.215 United states
85.35.145.216 85.35.145.223 United states
85.35.145.224 85.35.145.231 United states
85.35.145.232 85.35.145.239 United states
85.35.145.240 85.36.145.240 United states
85.36.145.241 85.37.189.255 United states
85.37.190.0 85.37.191.255 United states
----------txt------------------------------------------------
以上每条的含义是 从 "ip1" 到 "ip2" 属于 "国家"
即 从 3.0.12.0 到 3.0.12.255 属于 United states(美国)
3.0.13.0 到 3.0.14.255 属于 United states
3.0.15.0 到 3.0.15.255 属于 United states
3.0.16.0 到 3.0.103.255 属于 United states
依次类推
通过观察大家可以发现 大部分ip段是可以整合的。
对 “整合” 我简单解释以下。
一个ip我把他分为4个部分组成,即一个ip可以用 A.B.C.D 表示
例一:
----------------------------------------------
A.B.C.D A.B.C.D
3.0.12.0 3.0.12.255 United states
3.0.13.0 3.0.14.255 United states
3.0.15.0 3.0.15.255 United states
3.0.16.0 3.0.103.255 United states
3.0.104.0 3.0.104.255 United states
3.0.105.0 3.0.117.255 United states
3.0.118.0 3.0.118.255 United states
3.0.119.0 3.0.229.255 United states
3.0.230.0 3.0.230.255 United states
3.0.231.0 3.0.255.255 United states
3.2.0.0 3.2.2.255 United states
3.2.3.0 3.2.3.255 United states
-----------------------------------------------
打个简单比方:
--------------
1 2 黑色
5 6 黑色
7 9 黑色
100 102 黑色
107 109 黑色
110 112 黑色
--------------
那么将上面的整合:
1 2 黑色
5 9 黑色
100 102 黑色
107 112 黑色
--------------
再回到例一:
(因为每位ip 数字不能超过255,相当于到256就要进一位,)
3.0.12.255 的下一个ip就是 3.0.13.0
3.0.14.255 的下一个ip 就是 3.0.15.0
3.0.15.255 的下一个ip 就是 3.0.16.0
...
3.2.2.255 的下一个ip 就是 3.2.3.0
那么以上例一中ip段可以整合为:
3.0.12.0 3.0.255.255 United states
3.2.0.0 3.2.3.255 United states
例二:
---------
A.B.C.D A.B.C.D
85.32.145.144 85.32.145.151 United states
85.32.145.152 85.32.145.175 United states
85.35.145.200 85.35.145.207 United states
85.35.145.208 85.35.145.215 United states
85.35.145.216 85.35.145.223 United states
85.35.145.224 85.35.145.231 United states
85.35.145.232 85.35.145.239 United states
85.35.145.240 85.36.145.240 United states
85.36.145.241 85.37.189.255 United states
85.37.190.0 85.37.191.255 United states
---------
整合后为 :
---------
85.32.145.144 85.37.191.255 United states
---------
希望上面2个例子能解释清楚 “整合” 的含义。
一个ip我把他分为4个部分组成,即一个ip可以用 A.B.C.D 表示
我想将这个文本中ip的 B 段进行整合, 这样可以大大减少数据的处理量。
我的思路是:
如果对 ip中的 B C D 段都进行分析比较然后整合话,计算次数太多影响效率。
所以我把 CD 2段先去掉,只对 B 段进行比较整合。然后用0.0 和 255.255 来填充C.D 2段。
那么例一整合后的结果就是:
A.B.C.D A.B.C.D
3.0.0.0 3.0.255.255
3.2.0.0 3.2.255.255
例二整合后的结果就是:
A.B.C.D A.B.C.D
85.32.0.0 85.37.255.255
国家地址部分的数据不用输出。
由于水平有限,只能想出这样的笨办法,
我自己尝试写了一段代码,由于其中有大量的数据对比,用我字就写的这个代码处理完这个文本大概需要一个星期的时间,还
会出不少错误(让大家见笑了)。
所以请各位老师指教,有没更好更有效率的方法和代码。
可以用纯真 ip数据库 测试,将数据解压成文本就和我要处理的文本格式一样了。
http://www.crsky.com/soft/2611.html 下载地址
感谢exzzz的提醒
谢谢了。
[ Last edited by HAT on 2009-1-11 at 22:34 ]
|
|
2009-1-9 22:39 |
|
|
exzzz
初级用户
游手好闲 + 无所事事 ..
积分 194
发帖 167
注册 2007-4-30
状态 离线
|
『第
2 楼』:
有个命令是sort,对你的数据先进行排序,排列完毕,剩下的就容易了吧?
排序完毕之后将它拆分成30个文件,用excel导入,用“.”作为分隔符,然后用自动筛选功能筛选前两位,就算手动去做,也要不了一会吧???
实在不行,楼主你把数据打包贴上来,或许有人愿意帮你做一个批处理搞一下,呵呵
|
|
2009-1-10 17:42 |
|
|
cz1314
初级用户
积分 64
发帖 43
注册 2007-11-12
状态 离线
|
『第
3 楼』:
Quote: | Originally posted by exzzz at 2009-1-10 05:42 PM:
有个命令是sort,对你的数据先进行排序,排列完毕,剩下的就容易了吧?
排序完毕之后将它拆分成30个文件,用excel导入,用“.”作为分隔符,然后 ... |
|
看来是我没解释清楚, 我马上重新编辑下帖子。
谢谢你恢复!
|
|
2009-1-10 17:46 |
|
|
cz1314
初级用户
积分 64
发帖 43
注册 2007-11-12
状态 离线
|
『第
4 楼』:
已经对帖子进行重新编辑。。 希望这次能解释的更清楚些。
|
|
2009-1-10 18:34 |
|
|
exzzz
初级用户
游手好闲 + 无所事事 ..
积分 194
发帖 167
注册 2007-4-30
状态 离线
|
『第
5 楼』:
还是看不懂。。。猜测你的本意,是不是这样:
假设IP有如下:
3.0.0.0 3.0.12.255
3.0.31.0 3.0.255.255
3.1.13.13 3.1.19.33
3.2.14.1 3.2.254.32
3.5.254.1 3.5.254.32
就要输出
3.0.0.0 3.2.255.255
3.5.0.0 3.5.255.255
因为,3.0到3.2的都出现过,而3.3跟3.4开头的没有出现,因此不连续统计?
|
|
2009-1-10 18:52 |
|
|
cz1314
初级用户
积分 64
发帖 43
注册 2007-11-12
状态 离线
|
『第
6 楼』:
你举例整合的结果是正确的。
文本中大部分都是连续的ip ,
按你举例中说的
如果光通过判断 B 段中 是否出现 3 4 ,可能会出现较大的误差。
不妨老师先写段代码 我测试下。
[ Last edited by cz1314 on 2009-1-10 at 19:55 ]
|
|
2009-1-10 19:54 |
|
|
exzzz
初级用户
游手好闲 + 无所事事 ..
积分 194
发帖 167
注册 2007-4-30
状态 离线
|
『第
7 楼』:
该贴算法有误,已经删除了,请看下面的。
[ Last edited by exzzz on 2009-1-11 at 16:17 ]
|
|
2009-1-10 22:02 |
|
|
exzzz
初级用户
游手好闲 + 无所事事 ..
积分 194
发帖 167
注册 2007-4-30
状态 离线
|
『第
8 楼』:
当然,我用的数据表是明显有误的,没有你的那么规范,因为你提供的数据表每一行的数据的A都是相同的,所以我只对前2位的数据进行比较,看是否连续,并没有对后面的数据加以处理。
如果测试有问题,请贴一部分IP数据表出来,我好测试。
我写的代码是最简单也是最蠢的办法,请各位不吝赐教,如何让算法或思路更加优化。
[ Last edited by exzzz on 2009-1-10 at 22:12 ]
|
|
2009-1-10 22:07 |
|
|
exzzz
初级用户
游手好闲 + 无所事事 ..
积分 194
发帖 167
注册 2007-4-30
状态 离线
|
『第
9 楼』:
现在在网上找了一个纯真版的TXT版IP数据库,包含11万行IP数据,耗时4分钟完毕,查询结果包含3441个段。
手动核对一遍,发现问题了,呵呵,重写。。。
会出现问题的地方:
例如数据
3.1.1.1 5.1.255.255
5.2.0.0 5.2.1.1
5.2.3.1 5.3.4.4
实际上出来的结果最优化的是:
3.1.1.1 5.2.1.1
5.2.3.1 5.3.4.4
等下重写。。。吃饭去了。。。
[ Last edited by exzzz on 2009-1-10 at 22:40 ]
|
|
2009-1-10 22:29 |
|
|
cz1314
初级用户
积分 64
发帖 43
注册 2007-11-12
状态 离线
|
『第
10 楼』:
谢谢老师了! 用纯真数据库 测试 是可以达到验证效果的。
我都忘记了 呵呵!!!
我自己写的代码也有这个问题,就是每比较整合一次都会省略掉一行数据,这样以来会丢失大量的数据。
国家地址部分的数据 可以不用输出。
只需要ip 部分的数据。
[ Last edited by cz1314 on 2009-1-11 at 03:10 ]
|
|
2009-1-11 02:35 |
|
|
cz1314
初级用户
积分 64
发帖 43
注册 2007-11-12
状态 离线
|
『第
11 楼』:
我测试了您的代码,除了发你说的问题以外,还有个问题。
我把要处理的文本看成以下模式:
A1.B1.C1.D1 A2.B2.C2.D2
... ...
... ...
A1.B1.C1.D1 A2.B2.C2.D2
您的代码只对 B1 是否连续进行了比较,而没有比较B2与B1是否连续(上一行B2与下一行B1的比较)。
举个简单的例子:
-----------ipdata.txt----------
3.31.204.0 3.31.232.255
3.32.233.0 3.32.233.255
3.33.234.0 3.33.242.255
3.34.243.0 3.37.243.255 **
3.37.244.0 3.38.40.255 **
3.38.41.0 3.38.41.255
3.38.42.0 3.38.68.255
3.38.69.0 3.38.69.255
3.38.70.0 3.40.15.255 **
3.40.16.0 3.40.16.255 **
3.40.17.0 3.40.115.255
-----------ipdata.txt----------
用你的代码处理后的结果是
3.31.0.0 3.34.255.255
3.37.0.0 3.38.255.255
3.40.0.0 3.40.255.255
而正确结果应该是:
3.31.0.0 3.40.255.255
我用 ** 标记的部分其实是连续的,
A1.B1.C1.D1 A2.B2.C2.D2
3.34.243.0 3.37.243.255 **
3.37.244.0 3.38.40.255 **
。。。 。。。
3.38.70.0 3.40.15.255 **
3.40.16.0 3.40.16.255 **
将上一行中的 B2 与 下一行中的 B1 进行比较就知道这2行ip段是连续的。
不知道这样解释是否清楚。
|
|
2009-1-11 03:31 |
|
|
exzzz
初级用户
游手好闲 + 无所事事 ..
积分 194
发帖 167
注册 2007-4-30
状态 离线
|
『第
12 楼』:
我是这样想的,所有的IP都可以换算成10进制整数,那么你提供的IP表经过换算后,是如下数组:
1,2,11,13,14,15,19,31
那么最理想的分组就是
1-2
11-11
13-15
19-19
31-31
你看这样行不行?
|
|
2009-1-11 12:29 |
|
|
exzzz
初级用户
游手好闲 + 无所事事 ..
积分 194
发帖 167
注册 2007-4-30
状态 离线
|
『第
13 楼』:
这个是统计A.B.C.D精度的,最高精度区分IP段。
更新了一下,现在可以分段了,但是分隔符那里你可能要自己修改一下才能适应你的数据表分隔符。
就是for /f "tokens=1-8 delims=. " 这里,小数点和空格修改成小数点和你的分隔符。
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
title IP分段工具,开始时间是 %time%
del /f /q 分段结果.txt 2>nul
set start1=
set n=0
for /f "tokens=1-8 delims=. " %%a in (IPDATA.txt) do (
set /a n=!n!+1
if #!start1!#==## (
set start1=%%a&set start2=%%b&set start3=%%c&set start4=%%d
SET /A oldnum2=%%a*256*256*256+%%b*256*256+%%c*256+%%d
)
SET /A nownum1=%%a*256*256*256+%%b*256*256+%%c*256+%%d
if /i !nownum1! GTR !oldnum2! (
echo !start1!.!start2!.!start3!.!start4! !end1!.!end2!.!end3!.!end4! >>分段结果.txt
echo 输出IP段 !start1!.!start2!.!start3!.!start4! --- !end1!.!end2!.!end3!.!end4!
set start1=%%a&set start2=%%b&set start3=%%c&set start4=%%d
)
SET /A oldnum2=%%e*256*256*256+%%f*256*256+%%g*256+%%h+1
set end1=%%e&set end2=%%f&set end3=%%g&set end4=%%h
if /i !n! gtr 9999 (
echo 每处理10000行刷新一次,现在正在处理 %%a.%%b.%%c.%%d %%e.%%f.%%g.%%h
set n=0
)
)
echo !start1!.!start2!.!start3!.!start4! !end1!.!end2!.!end3!.!end4! >>分段结果.txt
echo ********************
rem type 分段结果.txt
pause 测试数据 IPDATA.TXT:
3.0.12.0 3.0.12.255 United states
3.0.13.0 3.0.14.255 United states
3.0.15.0 3.0.15.255 United states
3.0.16.0 3.0.103.255 United states
3.0.104.0 3.0.104.255 United states
3.0.105.0 3.0.117.255 United states
3.0.118.0 3.0.118.255 United states
3.0.119.0 3.0.229.255 United states
3.0.230.0 3.0.230.255 United states
3.0.231.0 3.0.255.255 United states
3.2.0.0 3.2.2.255 United states
3.2.3.0 3.2.3.255 United states
85.32.145.144 85.32.145.151 United states
85.32.145.152 85.32.145.175 United states
85.35.145.200 85.35.145.207 United states
85.35.145.208 85.35.145.215 United states
85.35.145.216 85.35.145.223 United states
85.35.145.224 85.35.145.231 United states
85.35.145.232 85.35.145.239 United states
85.35.145.240 85.36.145.240 United states
85.36.145.241 85.37.189.255 United states
85.37.190.0 85.37.191.255 United states 处理结果 :
3.0.12.0 3.0.255.255
3.2.0.0 3.2.3.255
85.32.145.144 85.32.145.175
85.35.145.200 85.37.191.255 [ Last edited by exzzz on 2009-1-11 at 16:28 ]
|
|
2009-1-11 13:16 |
|
|
cz1314
初级用户
积分 64
发帖 43
注册 2007-11-12
状态 离线
|
|
2009-1-11 15:27 |
|
|
cz1314
初级用户
积分 64
发帖 43
注册 2007-11-12
状态 离线
|
『第
15 楼』:
测试结果 还存在问题。我把结果和测试文本发出来。
从结果可以看出:
得到到的结果依然可以再整和,
-------结果取样--------
2.6.190.56 2.6.190.63
3.0.0.0 4.17.135.31
4.17.135.64 4.17.142.255
4.17.143.16 4.18.40.135
4.18.40.144 4.18.65.255
4.18.67.0 4.18.100.31
4.18.100.40 4.19.162.143
4.19.162.152 4.20.73.15
4.20.73.32 4.21.69.63
4.21.70.0 4.21.164.183
4.21.164.192 4.21.183.255
4.21.184.128 4.23.82.127
4.23.82.192 4.23.128.183
4.23.128.192 4.24.144.255
-------结果取样--------
这是测试结果的部分数据,这段数据明显可以再次整合,结果应该为:
2.6.190.56 2.6.190.63
3.0.0.0 4.24.144.255
但是我发现这个代码有个很大的优点 ,就是没有用0.0 和255.255填充CD段。
这样大大提高了精确性,而且计算速度很快。
[ Last edited by cz1314 on 2009-1-11 at 15:47 ]
附件
1: test.part01.rar (2009-1-11 15:47, 71.09 K,下载次数: 8)
|
|
2009-1-11 15:46 |
|