返回列表 发帖
42楼namejm似乎漏掉了个sort, 若原始文件未经排序则会结果错误
这个题好像只有这个思路是最高效的了
只是不知道 if defined 和 if "a"=="b" 到底谁更快
只知道在海量数据中 set a=要比set "a="快,引号或多或少会对效率有点影响吧?
@echo off
for /f "tokens=1,2" %%i in (quhao.txt) do set %%j=%%i
setlocal enabledelayedexpansion
(for /f "tokens=1,2" %%i in (data.txt) do (
   echo %%i %%j>con
   if defined %%j echo %%i !%%j!&set %%j=
))>result.txt
sort result.txt /o result2.txt&rem 若原始文件本身就以排好序则不需这一句。
start result2.txtCOPY
技术问题请到论坛发帖求助!

TOP

麻烦谁把楼主的数据文件给我邮箱里发一份
顶楼的链接我这里访问不到
天的白色影子

TOP

回复 45楼 的帖子

这跟你顶楼的描述不是冲突了吗?你的要求到底是怎样的呢?
应该将归属地相同连续号段进行精简
如1331000 至1331019都是上海,保留1331000即可
而往下1351210至1351219还是上海,同理保留1351210

TOP

原帖由 CUer 于 2010-5-6 09:56 发表
这跟你顶楼的描述不是冲突了吗?你的要求到底是怎样的呢?



谢谢一如既往的关注,我修改了顶楼的说明,这次应该能说明白

TOP

回复 47楼 的帖子

已帮楼主把数据上传到顶楼
1

评分人数

技术问题请到论坛发帖求助!

TOP

原帖由 随风 于 2010-5-6 14:29 发表
已帮楼主把数据上传到顶楼


谢谢版主,但是我把data.txt和quhao.txt更新了
可惜权限不够,无法编辑

TOP

回复 42楼 的帖子

46楼的代码存在楼主所说的
一个地区一个号段的问题
算法与42楼存在本质的不同

42楼的代码有几个问题

setlocal的位置不知为何放在for之后
但是如果在命令行环境中执行此代码
将使cmd的当前会话产生大量临时变量
这显然违背了程序的设计原则

echo %%i %%j>con
应该是显示进度的
但正是它严重影响力程序的性能
去掉它运行速度可以提高十几倍
所以不如去掉
@echo off & setlocal enabledelayedexpansion
set t=%time%
for /f "tokens=1,2" %%i in (quhao.txt) do set %%j=%%i
(for /f "tokens=1,2" %%i in (data.txt) do (
    if not "%%j"=="!address!" (
        echo %%i !%%j!
        set address=%%j
    )
))>result.txt
echo 起始时间:%t%
echo 终止时间:%time%
pause
start result.txtCOPY
天的白色影子

TOP

回复52楼qzwqzw

感谢了,你的代码测试后,没问题
目前你和37楼的结果正确

42楼和46楼都增加了进度显示,确实速度大大降低
看来你的做法,加上起止的时间较为方便

不过我一楼补充了内容,这个没有实现,详见一楼第2条

[ 本帖最后由 jack1505 于 2010-5-6 18:11 编辑 ]

TOP

回复 53楼 的帖子

按照新要求重新写了代码
急就章之作请多做测试
因为不确定连续同一地区的多个号码段中是否存在未知号码段
所以对数据中的每个号码段都做了之前是否存在未知号码段的判定
因此代码运行时间增加为3倍左右
@echo off & setlocal enabledelayedexpansion
set t=%time%
for /f "tokens=1,2" %%i in (quhao.txt) do set %%j=%%i
set nextnum=1300000
(for /f "tokens=1,2" %%i in (data.txt) do (
    if %%i neq !nextnum! (
echo !nextnum! 111
set area=未知
)
    if not "%%j"=="!area!" (
        echo %%i !%%j!
        set area=%%j
    )
set /a nextnum=%%i+1
))>result.txt
echo 起始时间:%t%
echo 终止时间:%time%
pause
start result.txtCOPY

[ 本帖最后由 qzwqzw 于 2010-5-6 18:47 编辑 ]
天的白色影子

TOP

1,如果号码不是连续的增加一个未知项
2,如果区域在quhao.txt中不存在,转为未知项
@echo off&setlocal enabledelayedexpansion
sort data.txt /o data1.txt
for /f "tokens=1-2" %%a in (quhao.txt) do set %%b=%%a
::\\取第一个电话号码
set /p num=<data1.txt
set /a num=num
::\\\\\\\
(
for /f "tokens=1-2" %%a in (data1.txt) do (
    if "!var!" neq "%%b" (
        if !num! neq %%a echo; !num! !未知!
        if #!%%b! equ # (echo;%%a !未知!) else echo;%%a !%%b!
        set var=%%b
) else (set /a num=%%a+1)
)
)>结果.txtCOPY

TOP

RE: 55

测试了下,结果最前面的几行为
1300000 10
1300000 111
1300001 519
1300000 111
1300002 565
1300000 111
1300006 25
1300000 111
1300008 27
1300000 111
1300010 10

与 LZ 在顶楼的要求是不符的:
1300000 10
1300001 519
1300002 565
1300003 111
1300006 25
1300007 111
1300008 27
1300009 111

TOP

改成这样应该可以了
@echo off&setlocal enabledelayedexpansion
sort data.txt /o data1.txt
for /f "tokens=1-2" %%a in (quhao.txt) do set %%b=%%a
::\\取第一个电话号码
set /p num=<data1.txt
set /a num=num
::\\\\\\\
(
for /f "tokens=1-2" %%a in (data1.txt) do (
    if "!var!" neq "%%b" (
        if !num! neq %%a echo;!num! !未知!
        if #!%%b! equ # (echo;%%a !未知!) else echo;%%a !%%b!
        set var=%%b
    )
set /a num=%%a+1
)
)>结果.txtCOPY

[ 本帖最后由 netbenton 于 2010-5-6 21:38 编辑 ]

TOP

回复 57楼 的帖子

楼主不是说1534978后面应该为空么,但你的结果里面对应的是111。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

type data.txt | gawk -F"[ \t]" "(NR!=1)&&($1!=p1+1){print p1+1\" 未知\"}($1!=p1+1)||(p2!=$2){print $1,$2}{p1=$1;p2=$2}" >jingjian.txt
gawk "NR==FNR{a[$2]=$1}NR>FNR{if($2 in a)print $1,a[$2];else print $1}" quhao.txt jingjian.txt >result.txtCOPY
57楼得到的结果是50641行
我的代码得到和54楼得到的结果一样都是50679行

TOP

回复59楼

这次代码运行没问题,结果也正确
尤其体现出gawk命令的速度优势

谢谢!!!

[ 本帖最后由 jack1505 于 2010-5-6 23:58 编辑 ]

TOP

返回列表