中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-09-13 14:48
47,812 主题排行 / 349,916 发帖 / 今日 0 篇 / 48,268 会员排行
DOS批处理 & 脚本技术(批处理室) » [已结]对ip段的整合,涉及超多次比较!
可打印版本  3,287 / 40
第1楼 cz1314 发表于 2009-01-09 22:39
初级用户 发帖 43 积分 64
[已结]对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 ]
第2楼 exzzz 发表于 2009-01-10 17:42
初级用户 发帖 167 积分 194
有个命令是sort,对你的数据先进行排序,排列完毕,剩下的就容易了吧?

排序完毕之后将它拆分成30个文件,用excel导入,用“.”作为分隔符,然后用自动筛选功能筛选前两位,就算手动去做,也要不了一会吧???

实在不行,楼主你把数据打包贴上来,或许有人愿意帮你做一个批处理搞一下,呵呵
第3楼 cz1314 发表于 2009-01-10 17:46
初级用户 发帖 43 积分 64
Originally posted by exzzz at 2009-1-10 05:42 PM:
有个命令是sort,对你的数据先进行排序,排列完毕,剩下的就容易了吧?

排序完毕之后将它拆分成30个文件,用excel导入,用“.”作为分隔符,然后 ...



看来是我没解释清楚, 我马上重新编辑下帖子。

谢谢你恢复!
第4楼 cz1314 发表于 2009-01-10 18:34
初级用户 发帖 43 积分 64
已经对帖子进行重新编辑。。 希望这次能解释的更清楚些。
第5楼 exzzz 发表于 2009-01-10 18:52
初级用户 发帖 167 积分 194
还是看不懂。。。猜测你的本意,是不是这样:

假设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开头的没有出现,因此不连续统计?
第6楼 cz1314 发表于 2009-01-10 19:54
初级用户 发帖 43 积分 64
你举例整合的结果是正确的。
文本中大部分都是连续的ip ,
按你举例中说的
如果光通过判断 B 段中 是否出现 3 4 ,可能会出现较大的误差。

不妨老师先写段代码 我测试下。

[ Last edited by cz1314 on 2009-1-10 at 19:55 ]
第7楼 exzzz 发表于 2009-01-10 22:02
初级用户 发帖 167 积分 194
该贴算法有误,已经删除了,请看下面的。

[ Last edited by exzzz on 2009-1-11 at 16:17 ]
第8楼 exzzz 发表于 2009-01-10 22:07
初级用户 发帖 167 积分 194
当然,我用的数据表是明显有误的,没有你的那么规范,因为你提供的数据表每一行的数据的A都是相同的,所以我只对前2位的数据进行比较,看是否连续,并没有对后面的数据加以处理。

如果测试有问题,请贴一部分IP数据表出来,我好测试。

我写的代码是最简单也是最蠢的办法,请各位不吝赐教,如何让算法或思路更加优化。

[ Last edited by exzzz on 2009-1-10 at 22:12 ]
第9楼 exzzz 发表于 2009-01-10 22:29
初级用户 发帖 167 积分 194
现在在网上找了一个纯真版的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 ]
第10楼 cz1314 发表于 2009-01-11 02:35
初级用户 发帖 43 积分 64
谢谢老师了! 用纯真数据库 测试 是可以达到验证效果的。

我都忘记了 呵呵!!!

我自己写的代码也有这个问题,就是每比较整合一次都会省略掉一行数据,这样以来会丢失大量的数据。



国家地址部分的数据 可以不用输出。

只需要ip 部分的数据。

[ Last edited by cz1314 on 2009-1-11 at 03:10 ]
第11楼 cz1314 发表于 2009-01-11 03:31
初级用户 发帖 43 积分 64
我测试了您的代码,除了发你说的问题以外,还有个问题。

我把要处理的文本看成以下模式:

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段是连续的。

不知道这样解释是否清楚。
第12楼 exzzz 发表于 2009-01-11 12:29
初级用户 发帖 167 积分 194
我是这样想的,所有的IP都可以换算成10进制整数,那么你提供的IP表经过换算后,是如下数组:
1,2,11,13,14,15,19,31
那么最理想的分组就是
1-2
11-11
13-15
19-19
31-31
你看这样行不行?
第13楼 exzzz 发表于 2009-01-11 13:16
初级用户 发帖 167 积分 194
这个是统计A.B.C.D精度的,最高精度区分IP段。

更新了一下,现在可以分段了,但是分隔符那里你可能要自己修改一下才能适应你的数据表分隔符。

就是for /f "tokens=1-8 delims=. " 这里,小数点和空格修改成小数点和你的分隔符。



测试数据 IPDATA.TXT:


处理结果 :


[ Last edited by exzzz on 2009-1-11 at 16:28 ]
第14楼 cz1314 发表于 2009-01-11 15:27
初级用户 发帖 43 积分 64
我来测试下,谢谢 !
第15楼 cz1314 发表于 2009-01-11 15:46
初级用户 发帖 43 积分 64
测试结果 还存在问题。我把结果和测试文本发出来。
从结果可以看出:
得到到的结果依然可以再整和,
-------结果取样--------
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 ]

附件
test.part01.rar (71.09 KiB)
1 2 3  下一页
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023