[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 批处理按照手机号段整理手机号码数据库

在其他论坛看到了一个按照手机号段整理收集号码数据库的求助帖,觉得这个题目很有挑战性,并且也很实用,特发出来让大家练练手。

  提示:整理出来的数据共有5670行,生成的文件大小至少129K,占用空间132K。

  以下是那位楼主的原帖,原始格式数据请下载附件。

有一个文本为139.txt,部分内容如下:


省份城市城市区号139013911392
上海上海21160-162600-899 空
云南临沧883883,921 空700-701,703,830-839
云南丽江888888 空704,880-889
云南保山875875 空705,750-759
云南楚雄878878 空707-708,780-789
云南版纳691881 空810-819
云南玉溪877877,889 空770-779,840-849
云南红河873873 空730-739,800-809
云南迪庆887 空 空870-879
内蒙古临河478478 空 空
内蒙古乌兰浩特482 空 空 空
内蒙古乌海473473 空 空
内蒙古包头472472 空 空

先解释一下,这个文本是139手机号段(前七位)的数据库,比如第一行的1390,指的是手机号的前四位,下面的160-199,指的是1390160~1390199之间的所有号段;再下面的883,921指的是两个号段,如13908831390921;空白的地方表示没有号段(已经替换为“空”),每个方格都以Tab键隔开。

需求:导出所有的号段,格式为"手机号段,省份,城市,城市区号"
例如:
1390160,上海,上海,21
1390161,上海,上海,21
1390162,上海,上海,21
1390883,云南,临沧,883
1390921,云南,临沧,883
。。。。。。。。。。

这只是139号段的一部分内容,并且还有很多其它号段的文本,但排列都是一样。自己考虑了很久,都不能实现,请问大家有没有什么好办法?


  补充说明一下:仔细观察txt文件,可以发现,同一行上的数据组成情况是非常复杂的:有的是3位,有的是4位,有的是以短横线连接的连续数字,
有的数字还是以0打头的,处理的时候要特别小心。
附件: 您需要登录才可以下载或查看附件。没有帐号?注册
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

给出的txt实在是太乱了.哪个对其哪个.不知道bat能不能对excel操作

TOP

  贴在表格中的数据复制到本地后,是比较乱,那是因为论坛会对一些空格做处理,而附件中的原始数据都是以跳格键来分隔的,不要受到视觉上的影响,直接数跳格键的个数、或者打开里面的excel文档来看就能知道数据的规律了。

  这个例子非常具有实用性,并且颇有挑战性:如何处理连续的跳格键、如何用代码确定哪列数据对应哪个位置、如何在连续和断开的数字中罗列所有的数值等等,都是非常考验人的。如果找对了方案,将会比较容易;如果没想到好方法,则会无从下手。暂时不提供代码,看看有谁能很好地解决它。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

回复 2楼 的帖子

BAT只能胜任简单的excel处理,稍微复杂点的可以使用VBS来解决。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. ::因论坛无法处理tab跳格,
  3. ::测试时将代码中的 set "tab=#" 中的#号改为tab键即可。。
  4. ::注意事项:
  5. ::需处理的号码出现 多少号至多少号时
  6. ::如 160-162 这种情况下“-”号左右的数字位数必须是一样的
  7. :: 象 198-1234 这样的就会出错。
  8. set "wj1=a.txt"
  9. set "wj2=b.txt"
  10. set "tab=#"
  11. if "%tab%"=="#" (
  12.    echo.&echo  请先将代码中的 set "tab=#" 中的#号改为tab键
  13.    echo.&pause>nul&exit
  14. )
  15. set t=%time%
  16. echo.1>nul 3>"%wj2%"
  17. set /p var=<"a.txt"
  18. for /l %%a in (1 1 3) do set "var=!var:*%tab%=!"
  19. set "var=!var:%tab%= !"
  20. for /f "usebackq skip=1 delims=" %%i in ("%wj1%") do (
  21.    for /f "tokens=1-3* delims=%tab%" %%a in ("%%i") do (
  22.       set "sen=%%a"
  23.       set "cen=%%b"
  24.       set "quhao=%%c"
  25.    )
  26.    set str=%%i
  27.    for /l %%a in (1 1 3) do set "str=!str:*%tab%=!"
  28.    for %%z in (%var%) do (
  29.       if not "!str:~0,1!"=="%tab%" (
  30.          for /f "tokens=1 delims=%tab%" %%E in ("!str!") do (
  31.            for %%f in (%%E) do (
  32.               set "num=%%f"
  33.               set "num2=!num:-=!"
  34.               if "!num2!"=="!num!" (set x=1!num! 1 1!num!) else (
  35.                  set "x=1!num:-= 1 1!"
  36.               )
  37.               for /l %%L in (!x!) do (
  38.                  set num3=%%L&set "num3=!num3:~1!"
  39.                  echo %%z!num3! !sen! !cen! !quhao!
  40.        ))))
  41.        set "str=!str:*%tab%=!"
  42. ))
  43. echo.1>nul 4>con
  44. echo  %t%
  45. echo  %time%
  46. call :time0 "%t%" "%time%" ok
  47. echo %ok%
  48. pause
  49. start "" notepad "%wj2%"
  50. exit
  51. :time0  计算批处理运行时间 (封装)
  52. @echo off&setlocal&set /a n=0&rem code 随风 @bbs.bathome.net
  53. for /f "tokens=1-8 delims=.: " %%a in ("%~1:%~2") do (
  54. set /a n+=10%%a%%100*360000+10%%b%%100*6000+10%%c%%100*100+10%%d%%100
  55. set /a n-=10%%e%%100*360000+10%%f%%100*6000+10%%g%%100*100+10%%h%%100)
  56. set /a s=n/360000,n=n%%360000,f=n/6000,n=n%%6000,m=n/100,n=n%%100
  57. set "ok=%s% 小时 %f% 分钟 %m% 秒 %n% 毫秒"
  58. endlocal&set "%~3=%ok:-=%"&goto :EOF
复制代码

[ 本帖最后由 随风 于 2009-2-14 05:12 编辑 ]
技术问题请到论坛发帖求助!

TOP

有大的错误,所以编辑掉。。。

[ 本帖最后由 batman 于 2009-2-14 12:34 编辑 ]
附件: 您需要登录才可以下载或查看附件。没有帐号?注册
***共同提高***

TOP

  随风的代码执行效率非常高,处理顶楼的文件在我的机器上只需要1秒多时间,这恐怕是最快的代码了。

  我也写了一个,效率比随风的慢多了,在我的机器上需要8秒左右的时间,但是,作为不同的解题思路,我还是献丑把代码发出来——再次对随风的代码表示赞叹:牛人不常有,今年特别多!
  1. @echo off
  2. :: 请把TAB字符替换为跳格键
  3. echo.1>nul 3>1.txt
  4. setlocal enabledelayedexpansion
  5. for /f "skip=1 delims=" %%i in (139.txt) do (
  6.     set "str=%%i"
  7.     set "str=!str:TAB=#TAB!"
  8.     set "str=!str:,=,!"
  9.     set num=-4
  10.     for %%j in (!str!) do (
  11.         set /a num+=1
  12.         if !num! lss 0 (
  13.             set address=%%j
  14.             set address=!address:#=!
  15.             set address!num!=!address!
  16.         ) else call :next %%j
  17.     )
  18. )
  19. echo.1>nul 4>con
  20. echo %time%
  21. start notepad.exe 1.txt
  22. pause
  23. exit
  24. :next
  25. set str=%1
  26. set str=%str:,=,%
  27. set str=%str:#=%
  28. for %%i in (%str%) do (
  29.     set var1=%%i
  30.     set var2=!var1:=-!
  31.     if "!var1!"=="!var2!" (
  32.         set var=1!var1!,1,1!var1!
  33.     ) else set var=1!var1:-=,1,1!
  34.     for /l %%i in (!var!) do (
  35.         set str=%%i
  36.         echo 139%num%!str:~1! %address-3% %address-2% %address-1%
  37.     )
  38. )
  39. goto :eof
复制代码
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

呵呵,过奖过奖,^_^

有了 echo.1>nul 3>1.txt  
就不需要 cd.>1.txt  了
技术问题请到论坛发帖求助!

TOP

贴下我的  凑个热闹
  1. @echo off&setlocal enabledelayedexpansion
  2. set "Tab=#"
  3. if "%Tab%"=="#" (
  4.    echo.&echo  请先将代码中的 set "Tab=#" 中的#号改为Tab键
  5.    echo.&pause>nul&exit
  6. )
  7. set/p str=<139.txt
  8. echo.1>nul 3>139_new.txt
  9. for /f "tokens=3* delims=%Tab%" %%i in ("%str%") do set str=%%j
  10.    for %%i in (%str%) do set/a n+=1&set _!n!=%%i
  11.    for /f "skip=1 tokens=1-3* delims=%Tab%" %%i in (139.txt) do (
  12.    set "str=%%i%Tab%%%j%Tab%%%k"
  13.    set "var=%%l"
  14.    set "str1="&set "m="
  15.    set var=!var:%Tab%=%Tab%#!
  16.    call:next "!var!"
  17.    if not defined str1 echo;%Tab%!str!
  18. )
  19. echo.1>nul 4>con
  20. start notepad "139_new.txt"&exit
  21. :next
  22. for /f "tokens=1* delims=%Tab%" %%i in (%1) do (
  23.        set/a m+=1
  24.        for %%a in (%%i) do (
  25.        if not "%%a"=="#" (
  26.        set str1=%%a
  27.        set str1=!str1:#=!
  28.        set str2=!str1:*-=!
  29.        call set str1=%%str1:-!str2!=%%
  30.        for /l %%b in (1!str1! 1 1!str2!) do (
  31.        set b=%%b
  32.        if %%b lss 10000 (set b=!b:~-3!) else set b=!b:~-4!
  33.        call echo;%%_!m!%%!b!%Tab%!str!
  34.        )))
  35.        if not "%%j"=="" call :next "%%j"
  36.   )
  37.          
复制代码

[ 本帖最后由 terse 于 2009-2-14 10:58 编辑 ]

TOP

原帖由 随风 于 2009-2-14 10:38 发表
呵呵,过奖过奖,^_^

有了 echo.1>nul 3>1.txt  
就不需要 cd.>1.txt  了

  确实是不再需要cd.>1.txt了,呵呵,测试的收尾工作没做彻底。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

terse 的代码提示信息中好像少了个反括弧吧
你的代码有误,无法运行,是否发帖时错删了内容??

真是奇怪了,运行jm的代码,1.txt 中没有内容??

[ 本帖最后由 随风 于 2009-2-14 10:58 编辑 ]
技术问题请到论坛发帖求助!

TOP

原帖由 随风 于 2009-2-14 10:51 发表
terse 的代码提示信息中好像少了个反括弧吧
你的代码有误,无法运行,是否发帖时错删了内容??

确实是!   谢随风兄
另随风兄的代码如能应对不定列 就更完美了

[ 本帖最后由 terse 于 2009-2-14 11:00 编辑 ]

TOP

原帖由 terse 于 2009-2-14 10:59 发表

确实是!   谢随风兄
另随风兄的代码如能应对不定列 就更完美了


能说详细点吗?
我的代码应该是不受 列数 限制的啊。。?

[ 本帖最后由 随风 于 2009-2-14 11:08 编辑 ]
技术问题请到论坛发帖求助!

TOP

我6楼的还是有点问题,这个应该还可以了:
  1. @echo off&setlocal enabledelayedexpansion
  2. echo 139号段[tab]省份[tab]城市[tab]城市区号>num.xls
  3. for /f "delims=" %%a in (139.txt) do (
  4.     set /a n=-4&set "code="
  5.     set "str=%%a"&set "str=!str:,=#!"
  6.     for %%b in (!str!) do (
  7.         set /a n+=1
  8.         if !n! lss 0 (
  9.            set "code=!code![tab]%%b"
  10.            ) else (
  11.            if "%%b" neq "无" (
  12.               set "var=%%b"&set "var=!var:#= !"
  13.               for %%c in (!var!) do (
  14.                   set "string=%%c"&set "k="
  15.                   if "!string:-=!" neq "!string!" (
  16.                      for /f "tokens=1,2 delims=-" %%d in ("%%c") do (
  17.                          set "a=%%d"&set "b=%%e"
  18.                          if "!a:~,1!" equ "0" set "a=1!a!"&set "k=0"
  19.                          if "!b:~,1!" equ "0" set "b=1!b!"
  20.                          for /l %%f in (!a!,1,!b!) do (
  21.                              set "c=%%f"
  22.                              if defined k set "c=!c:~1!"
  23.                              echo 139!n!!c![tab]!code:~1!>>num.xls
  24.                          )
  25.                      )
  26.                      ) else (
  27.                      echo 139!n!%%c[tab]!code:~1!>>num.xls
  28.                   )
  29.               )
  30.            )
  31.         )
  32.      )
  33. )
  34. start num.xls
复制代码
附件: 您需要登录才可以下载或查看附件。没有帐号?注册
***共同提高***

TOP

原帖由 随风 于 2009-2-14 10:51 发表
真是奇怪了,运行jm的代码,1.txt 中没有内容??

  更新代码的时候,漏打了两个字符,现在已经改过来了。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

返回列表