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

[文本处理] 批处理怎样分离移动、联通、电信号码?【已解决】

本帖最后由 wany_cao 于 2011-4-7 18:30 编辑

处理某txt文档 ,其内容全部为电话号码,每行一个,格式如下:
13612345678
15712345678
18812345678
13312345678
……
        请教如何用批处理将其中的电话号码移动、联通、电信分别分离出来,形成三个txt文档,命名为被分离出的移动号码:原文件名+移动 ,联通号码:原文件名+联通 ,电信号码:原文件名+电信;如被处理文档中没有某种号码,则仅生出其中存在的号码段的一个或者两个文档。
已知移动号段前三位为:139、138、137、136、135、134、159、158、157、152、151、150、188、187
       联通号段前三位为:130、131、132、155、156、186、185
       电信号段前三位为:133、153、189、180
       谢谢各位前辈不吝赐教,我什么也不会55555

  假设你要处理的txt文档叫“手机号.txt”文档,并且所有的号码都是顶格写的,可以用下面这个代码:
  1. @echo off
  2. for %%i in (手机号.txt) do set name=%%~ni
  3. findstr /b "13[4-9]" %name%.txt>%name%移动.txt
  4. findstr /b "15[0-2,7-9]" %name%.txt>>%name%移动.txt
  5. findstr /b "18[7,8]" %name%.txt>>%name%移动.txt
  6. findstr /b "13[0-2]" %name%.txt>%name%联通.txt
  7. findstr /b "15[5,6]" %name%.txt>>%name%联通.txt
  8. findstr /b "18[5,6]" %name%.txt>>%name%联通.txt
  9. findstr /b "133" %name%.txt>%name%电信.txt
  10. findstr /b "153" %name%.txt>>%name%电信.txt
  11. findstr /b "18[0,9]" %name%.txt>>%name%电信.txt
  12. pause
复制代码
1

评分人数

尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

jm这么多次findstr效率不会高吧,不如用变量赋值法解决:
  1. @echo off&setlocal enabledelayedexpansion
  2. for %%a in (139 138 137 136 135 134 159 158 157 152 151 150 188 187) do set "_%%a=移动"
  3. for %%a in(130 131 132 155 156 186 185) do set "_%%a=联通"
  4. for %%a in (133 153 180 189) do set "_%%a=电信"
  5. for /r %%a in (*.txt) do (
  6.       for /f %%b in (%%a) do (
  7.            set "str=%%b"&set "str=!str:~,3!"
  8.             for %%c in (!str!) do >>%%~na_!_%%c!.txt echo %%b
  9.       )
  10. )
复制代码

[ 本帖最后由 batman 于 2011-3-11 17:10 编辑 ]
***共同提高***

TOP

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. rem 假设某txt文档路径为c:\hello.txt
  4. for /f "usebackq delims=" %%i in ("c:\hello.txt") do (
  5. set a=%%i
  6. for %%b in (139 138 137 136 135 134 159 158 157 152 151 150 188 187) do (if %%b==!a:~0,3! echo !a!>>c:\hello移动.txt)
  7. for %%k in (130 131 132 155 156 186 185) do (if !a:~0,3!==%%k echo !a!>>c:\hello联通.txt)
  8. for %%l in (133 153 189 180) do (if !a:~0,3!==%%l echo !a! >>c:\hello电信.txt)
  9. )
  10. pause
复制代码

TOP

哈哈,其实每一条数据都用set来替换,效率更低,大量数据我一向是能避免替换就不替换。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

我觉得jm的代码可以改为只执行三次findstr:
  1. @echo off
  2. for %%i in (手机号.txt) do set name=%%~ni
  3. findstr  "^13[4-9][0-9]*$ ^15[0-27-9][0-9]*$ ^18[78][0-9]*$" %name%.txt>%name%移动.txt
  4. findstr  "^13[0-2][0-9]*$ ^15[56][0-9]*$ ^18[56][0-9]*$" %name%.txt>%name%联通.txt
  5. findstr  "^133[0-9]*$ ^153[0-9]*$ ^18[09][0-9]*$" %name%.txt>%name%电信.txt
  6. pause>nul
复制代码
1

评分人数

看得多说得多,远比不上写得多。

TOP

谢谢各位大侠赐教, 以上代码经过试验;
2楼 namejm 的代码可用
6楼 weichenxiehou 简化的二楼代码可用
3楼和4楼的不知为何,不能分离出来;运行立即自动结束 。

TOP

2# namejm


3Q ,方法可行

TOP

新手学习了,批处理太牛了。。

TOP

返回列表