Board logo

标题: [已结]对ip段的整合,涉及超多次比较! [打印本页]

作者: cz1314     时间: 2009-1-9 22:39    标题: [已结]对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 ]
作者: exzzz     时间: 2009-1-10 17:42
有个命令是sort,对你的数据先进行排序,排列完毕,剩下的就容易了吧?

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

实在不行,楼主你把数据打包贴上来,或许有人愿意帮你做一个批处理搞一下,呵呵
作者: cz1314     时间: 2009-1-10 17:46


  Quote:
Originally posted by exzzz at 2009-1-10 05:42 PM:
有个命令是sort,对你的数据先进行排序,排列完毕,剩下的就容易了吧?

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

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

谢谢你恢复!
作者: cz1314     时间: 2009-1-10 18:34
已经对帖子进行重新编辑。。  希望这次能解释的更清楚些。
作者: exzzz     时间: 2009-1-10 18:52
还是看不懂。。。猜测你的本意,是不是这样:

假设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开头的没有出现,因此不连续统计?
作者: cz1314     时间: 2009-1-10 19:54
你举例整合的结果是正确的。
文本中大部分都是连续的ip ,
按你举例中说的
如果光通过判断  B 段中 是否出现 3 4  ,可能会出现较大的误差。

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

[ Last edited by cz1314 on 2009-1-10 at 19:55 ]
作者: exzzz     时间: 2009-1-10 22:02
该贴算法有误,已经删除了,请看下面的。

[ Last edited by exzzz on 2009-1-11 at 16:17 ]
作者: exzzz     时间: 2009-1-10 22:07
当然,我用的数据表是明显有误的,没有你的那么规范,因为你提供的数据表每一行的数据的A都是相同的,所以我只对前2位的数据进行比较,看是否连续,并没有对后面的数据加以处理。

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

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

[ Last edited by exzzz on 2009-1-10 at 22:12 ]
作者: exzzz     时间: 2009-1-10 22:29
现在在网上找了一个纯真版的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 ]
作者: cz1314     时间: 2009-1-11 02:35
谢谢老师了! 用纯真数据库 测试 是可以达到验证效果的。

我都忘记了 呵呵!!!

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



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

只需要ip 部分的数据。

[ Last edited by cz1314 on 2009-1-11 at 03:10 ]
作者: cz1314     时间: 2009-1-11 03:31
我测试了您的代码,除了发你说的问题以外,还有个问题。

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

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

不知道这样解释是否清楚。
作者: exzzz     时间: 2009-1-11 12:29
我是这样想的,所有的IP都可以换算成10进制整数,那么你提供的IP表经过换算后,是如下数组:
1,2,11,13,14,15,19,31
那么最理想的分组就是
1-2
11-11
13-15
19-19
31-31
你看这样行不行?
作者: exzzz     时间: 2009-1-11 13:16
这个是统计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 ]
作者: cz1314     时间: 2009-1-11 15:27
我来测试下,谢谢 !
作者: cz1314     时间: 2009-1-11 15:46    标题: 测试结果 还存在问题。我把结果和测试文本发出来。

从结果可以看出:
得到到的结果依然可以再整和,
-------结果取样--------
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)

作者: cz1314     时间: 2009-1-11 15:49    标题: 一个贴只能发一个附件!继续发下部分。

3.0.0.0 4.17.135.31
4.17.135.64 4.17.142.255

这2段ip 也是连续的。



再说直接点,
先比较每行的 A1.B1.C1.D1 进行比较。如果不连续 再将 A2.B2.C2.D2       与下一行的 A1.B1.C1.D1  比较是否连续。

[ Last edited by cz1314 on 2009-1-11 at 16:01 ]
附件 1: test.part02.rar (2009-1-11 15:50, 30.57 K,下载次数: 8)

作者: exzzz     时间: 2009-1-11 16:10
你上一贴的附件不完全,解压不了。

我觉得你设置的规则有些问题,例如你给的结果取样整合如下:
2.6.190.56 2.6.190.63
3.0.0.0  4.24.144.255

那么
2.6.190.0 到 2.6.190.55 是没有的,你没有整合,
2.6.190.64 到 2.6.190.255 是没有的,你没有整合,
4.23.128.184 到 4.23.128.193是没有的,为何要整合?如果是因为该段出现过IP,就整合表示该段A.B.0.0到该段的A.B.255.255都有,那就跟你上两条的规则矛盾了哦?

我觉得我的统计方法是严密的,统计所有连续段并输出。
作者: exzzz     时间: 2009-1-11 16:11
晕倒,原来你要的统计精度是 ABC,我第一写的是统计到A.B,第二次写的是A.B.C.D。。。。汗一个
作者: cz1314     时间: 2009-1-11 16:15


  Quote:
Originally posted by exzzz at 2009-1-11 04:10 PM:
你上一贴的附件不完全,解压不了。

我觉得你设置的规则有些问题,例如你给的结果取样整合如下:
2.6.190.56 2.6.190.63
3.0.0.0  4.24.144.255

那么
2 ...

应外一部分在你楼上的帖子里, 附件大了 只有分成2部分。

15楼,16楼一楼一个附件,2个放一起就可以解压了

我发现 理解有误差, 我重新解释下 待整理文本的含义:
---------------------
3.17.233.0        3.17.233.255        UNITED STATES
3.17.234.0        3.18.63.255        UNITED STATES
3.18.64.0        3.18.64.255        UNITED STATES
3.18.65.0        3.18.95.255        UNITED STATES
3.18.96.0        3.18.96.255        UNITED STATES
-----------------------
既,
从 3.17.233.0  到  3.17.233.255   属于美国ip段
从 3.17.234.0  到  3.18.63.255     属于美国
从 3.18.64.0    到  3.18.64.255         属于美国
从 3.18.65.0    到  3.18.95.255         属于美国
从 3.18.96.0    到  3.18.96.255         属于美国


每行的前部分与后部分是不用进行比较的,再举一个例子
现在有20个球,分别用0.1 - 2.0 的数字来表示。
---------文本-------------
0.1    0.4       黑色 (0.1号到0.4号球是黑色)
0.4    1.1       黑色
1.2    1.3       黑色
1.7    1.8       黑色
---------文本-------
这样上面文本可以整合。
0.1    1.3      黑色
1.7    1.8      黑色




这样解释不知道能不能有作用

[ Last edited by cz1314 on 2009-1-11 at 16:30 ]
作者: exzzz     时间: 2009-1-11 16:16
你把我第二次发的稍微修改一下,删除几个变量就可以用了。。。
我第一次写的那个,算法有误,不要使用了。
作者: exzzz     时间: 2009-1-11 16:26
2.6.190.56 2.6.190.63
3.0.0.0 4.18.65.255
4.18.67.0 4.24.144.255
4.24.146.0 4.25.164.255
4.25.166.0 4.37.0.255
4.37.2.0 4.48.215.255
4.48.217.0 4.48.218.255
4.48.222.0 4.48.222.255
4.48.230.0 4.78.21.255
4.78.24.0 4.78.55.255
4.78.58.0 4.255.255.255
6.0.0.0 9.4.13.255
9.4.15.0 9.4.28.255
9.4.30.0 9.4.76.255
9.4.78.0 9.4.93.255
9.4.95.0 9.255.255.255


这个是我修改脚本后,只统计ABC精度的结果,你看看是不是你要的?
作者: exzzz     时间: 2009-1-11 16:28
只统计A.B.C精度
@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+%%b*256+%%c
                )
        SET /A nownum1=%%a*256*256+%%b*256+%%c
        if /i !nownum1! GTR !oldnum2! (
                echo !start1!.!start2!.!start3!.!start4! !end1!.!end2!.!end3!.!end4! >>分段结果.txt
rem                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+%%f*256+%%g+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

作者: cz1314     时间: 2009-1-11 16:32


  Quote:
Originally posted by exzzz at 2009-1-11 04:26 PM:
2.6.190.56 2.6.190.63
3.0.0.0 4.18.65.255
4.18.67.0 4.24.144.255
4.24.146.0 4.25.164.255
4.25.166.0 4.37.0.255
4.37.2.0 4.48.215.255
4.48.217.0 4.48.218.255
4.48.222.0 4.48.222.255
...

这个结果没有整合完。

3.0.0.0          4.18.65.255
4.18.67.0      4.24.144.255

是连续的啊。    4.18.65.255 的下一个ip 数字就是  4.18.67.0

结果中 B 段部分都是可以再整合的


麻烦老师再看下  19楼。
并不是精度的问题,而是比较的问题。

ip1 -  ip2    美国
ip3 -  ip4    美国
ip5 -  ip6    美国
ip7 -  ip8    美国

我的思路先比较   ip1  ip3  是否连续 如果连续则 1、2行可以整合成
ip1 - ip4    美国
如果ip1 ip3  不是连续的,再比较 ip2 和ip3 ,如果ip2 ip3 是连续的,那么1、2也可以整合成  ip1 - ip4.如果这2个比较都不连续,则输出 ip1 -ip2 ,再进行下一轮比较,既比较ip3 和 ip5,如果连续则整合,不连续再比较 ip4 ip5是否连续,依次比较。。。

[ Last edited by cz1314 on 2009-1-11 at 16:39 ]
作者: cz1314     时间: 2009-1-11 16:42
不知道这样解释  能让您明白我的意思没?
作者: exzzz     时间: 2009-1-11 16:47
这个结果没有整合完。

3.0.0.0          4.18.65.255
4.18.67.0      4.24.144.255

是连续的啊。    4.18.65.255 的下一个ip 数字就是  4.18.67.0

结果中 B 段部分都是可以再整合的



4.18.65.255 的下一个ip 4.18.66.0 而不是  4.18.67.0 ,所以我截止到4.18.65.255输出了,没有错啊???


ip1 -  ip2    美国
ip3 -  ip4    美国
ip5 -  ip6    美国
ip7 -  ip8    美国

我的思路先比较   ip1  ip3  是否连续 如果连续则 1、2行可以整合成
ip1 - ip4    美国
如果ip1 ip3  不是连续的,再比较 ip2 和ip3 ,如果ip2 ip3 是连续的,那么1、2也可以整合成  ip1 - ip4.如果这2个比较都不连续,则输出 ip1 -ip2 ,再进行下一轮比较,既比较ip3 和 ip5,如果连续则整合,不连续再比较 ip4 ip5是否连续,依次比较。。。


IP1的后面有IP2,IP2至少比IP1大1,IP3至少比IP2大1,那IP3怎么可能等于IP1+1?所以不存在IP1跟IP3连续的可能,只存在IP2跟IP3连续的可能

[ Last edited by exzzz on 2009-1-11 at 16:52 ]
作者: cz1314     时间: 2009-1-11 16:52
不好意思我看走眼了。。。。非常抱歉。
作者: exzzz     时间: 2009-1-11 16:53
我晕……


没事我做月报去了,拜拜。

[ Last edited by exzzz on 2009-1-11 at 16:54 ]
作者: cz1314     时间: 2009-1-11 16:55
刚才是我看错了,很不好意思
能再提个要求么。  就是:
在 AB 相同的情况下 C 段比较后相差小于100 的都当连续的整合,

如果不方便就去掉c段的精度。只要 AB 精度。

[ Last edited by cz1314 on 2009-1-11 at 16:58 ]
作者: exzzz     时间: 2009-1-11 16:59


  Quote:
Originally posted by cz1314 at 2009-1-11 04:55 PM:
刚才是我看错了,很不好意思
能再提个要求么。  就是:
在 AB 相同的情况下 C 段比较后相差小于100 的都当连续的整合,

兄弟,自己研究一下吧,可以实现的。。。。。。
BTW,HAT版主肯定很不爽了,哈哈,他最不喜欢别人直接等脚本的,他喜欢启发新人自行处理问题。
我都提供那么多脚本了,你再修改修改就能实现了。

授人鱼不如授人以渔!
作者: cz1314     时间: 2009-1-11 17:07


  Quote:
Originally posted by exzzz at 2009-1-11 04:59 PM:



兄弟,自己研究一下吧,可以实现的。。。。。。
BTW,HAT版主肯定很不爽了,哈哈,他最不喜欢别人直接等脚本的,他喜欢启发新人自行处理问 ...

非常非常感谢,剩下的问题我自己解决。



88211412 是我的q  ,程序方面我不是很懂,如果在网络方面您碰到什么困难如果有我能帮的上的,您可以m我。
作者: exzzz     时间: 2009-1-11 17:17
明年开始我就不做移动的代维了,项目解散了,组员都走了。就剩下我了,boss说要调我去国税让我跟其他网络工程师学习网络,要学的东西可就多了。不过我也正好要学这方面。就好像算法里面的 IP换算成10进制一样,呵呵,昨晚还去翻了本CCNA的书才知道的。
作者: netbenton     时间: 2009-1-12 01:42    标题: 我来追加一个(全精度的),16秒完成

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
title IP分段工具,开始时间是 %time%
cd. >分段结果.txt
set n=
set _h1=1
echo.&echo.&echo.&echo.
for /f "tokens=1-8,* delims=.         " %%a in (ipdata.txt) do (
set _cu=0&set _e1=!_e!&set _f1=!_f!&set _g1=!_g!&set/a _h1=_h+1
if !_h!==255 (set _h1=0&set /a _g1=_g+1&if !_g!==255 (set _g1=0&set /a _f1=_f+1&if !_f!==255 (set _f1=0&set /a _e1=_e+1)))

if "!_from!"=="" set _from=%%a.%%b.%%c.%%d
if not !_e1!!_f1!!_g1!!_h1!==%%a%%b%%c%%d (if not "!_e!"=="" (echo !_from!        !_e!.!_f!.!_g!.!_h!        !_fi!>>分段结果.txt&set _from=%%a.%%b.%%c.%%d))
set _e=%%e&set _f=%%f&set _g=%%g&set _h=%%h
set _fi=%%i

set /a n+=1
set /p =      当前记录:!n!<nul

)

echo.
echo ********************
echo 结束时间是:%time%
echo ********************

pause

[ Last edited by netbenton on 2009-1-12 at 01:54 ]
作者: cz1314     时间: 2009-1-12 05:50    标题: 思路很牛b

思路很牛b

但是我不需要全精度的,
最合适的精度是 C 段 的差 小于100 就整合,大于100 分开。
------------
A1.B1.C1.D1   A2.B2.C2.D2
A3.B3.C3.D3   A4.B4.C4.D4
-------------------
也就是当 A2.B2  = A3.B3 的时候比较 C2和C3

当 C2-C3<=100 的时候 2段整合为:A1.B1.C1.D1  A4.B4.C4.D4

如果  C2-C3>100  不整合。

这是最适合的精度。。
作者: cz1314     时间: 2009-1-12 05:52
全精度的代码执行起来需要很厂时间,大概有400万条数据处理。
@echo off
title 全自动ip搜索整理,开始时间是 %time%
SETLOCAL ENABLEDELAYEDEXPANSION
@del /f /q ok.txt 2>nul
set start1=
set n=0
for /f "tokens=1-8 delims=.        " %%a in (ip.txt) do (
        set /a n=!n!+1
        if #!start1!#==## (
                set start1=%%a&set start2=%%b
                SET /A oldnum2=%%a*256+%%b
                )
        SET /A nownum1=%%a*256+%%b
        if /i !nownum1! GTR !oldnum2! (
                echo !start1!.!start2!.%%c.%%d !end1!.!end2!.%%g.%%h>>ok.txt
rem                echo 输出IP段  !!start1!.!start2!.!start3!.!start4! --- !end1!.!end2!.!end3!.!end4!
                set start1=%%a&set start2=%%b
                )
        SET /A oldnum2=%%e*256+%%f+1
        set end1=%%e&set end2=%%f
        if /i !n! gtr 9999 (
               
                set n=0
                )
)
这是我修改 exzzz 发出的代码

处理完400万条数据在 10分钟以内

全精度的好象需要几个小时

[ Last edited by cz1314 on 2009-1-12 at 05:55 ]
作者: exzzz     时间: 2009-1-12 12:05


  Quote:
Originally posted by netbenton at 2009-1-12 01:42 AM:
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
title IP分段工具,开始时间是 %time%
cd. >分段结果.txt
set n=
set _h1=1
echo.&echo.&echo.&echo.
for /f "tokens=1-8, ...

呵呵,我测试了一下,在我这台赛扬2.66的机器上,
将你我代码中所有有关 计数及屏显 的提示内容 rem 掉运行处理楼主提供的IPDATA.TXT。

你的算法需要14.3秒,我的算法用7.9秒。。。。。。
作者: netbenton     时间: 2009-1-12 20:09
我的处理纯真网络解压出来的ip数据36万多条记录(全精度)
用时04:41秒
结果只有一条:
0.0.0.0        255.255.255.255        纯真网络 2009年1月10日IP数据

[ Last edited by netbenton on 2009-1-12 at 20:16 ]
作者: cz1314     时间: 2009-1-13 00:43
哈哈!  netbenton  真幽默。你的代码的确不错!!!
作者: exzzz     时间: 2009-1-13 10:02


  Quote:
Originally posted by netbenton at 2009-1-12 08:09 PM:
我的处理纯真网络解压出来的ip数据36万多条记录(全精度)
用时04:41秒
结果只有一条:
0.0.0.0        255.255.255.255        纯真网络 2009年1月10日IP数据

[ Last edited by netbenton on 2009-1-12 at 20:16 ]

呵呵,我的也是。
作者: netbenton     时间: 2009-1-13 15:11


  Quote:
但是我不需要全精度的,
最合适的精度是 C 段 的差 小于100 就整合,大于100 分开。
------------
A1.B1.C1.D1   A2.B2.C2.D2
A3.B3.C3.D3   A4.B4.C4.D4
也就是当 A2.B2  = A3.B3 的时候比较 C2和C3

当 C2-C3<=100 的时候 2段整合为:A1.B1.C1.D1  A4.B4.C4.D4

如果  C2-C3>100  不整合。

这是最适合的精度。。
...

那这样的也不整合吗?
1.0.0.15  1.1.255.255
1.2.0.0  1.2.12.17
作者: netbenton     时间: 2009-1-13 15:20    标题: 大提速

::全精度比较
::处理楼主的ipdata.txt 用5秒,处理纯真的36万数据用1分17秒
::如果是400万数据,预计:13分左右


@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
title IP分段工具,开始时间是 %time%
cd. >分段结果.txt
set n=0
call :sub

echo.&echo.&echo.&echo.
for /f "tokens=1-8,* delims=.         " %%a in (ipdata.txt) do (
if !_h!==256 (set _h=0&set /a _g+=1&if !_g!==256 (set _g=0&set /a _f+=1&if !_f!==256 (set _f=0&set /a _e+=1)))
if not !_e!!_f!!_g!!_h!==%%a%%b%%c%%d (echo !_fr!        !_end!>>分段结果.txt&set _fr=%%a.%%b.%%c.%%d)
set _end=%%e.%%f.%%g.%%h
set _e=%%e&set _f=%%f&set _g=%%g&set/a _h=%%h+1
)
if not "!_g!"=="" echo !_fr!        !_end!>>分段结果.txt
echo ********************
echo 结束时间是:%time%
echo ********************
pause
goto :eof

:sub
for /f "tokens=1-8,* delims=.         " %%a in (ipdata.txt) do (
set _fr=%%a.%%b.%%c.%%d
set _e=%%a&set _f=%%b&set _g=%%c&set _h=%%d
goto :eof
)

[ Last edited by netbenton on 2009-1-15 at 20:46 ]
作者: cz1314     时间: 2009-1-14 00:29


  Quote:
Originally posted by netbenton at 2009-1-13 03:11 PM:

那这样的也不整合吗?
1.0.0.15  1.1.255.255
1.2.0.0  1.2.12.17

恩是个问题。但是可以用

(A2*65536+B2*256+C2)-(A2*65536+B3*256+C3)<>5  比较

这样可以吗?

[ Last edited by cz1314 on 2009-1-14 at 00:30 ]