标题: [文本处理] 批处理怎样分离移动、联通、电信号码?【已解决】 [打印本页]
作者: wany_cao 时间: 2011-3-11 15:03 标题: 批处理怎样分离移动、联通、电信号码?【已解决】
本帖最后由 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
作者: namejm 时间: 2011-3-11 16:30
假设你要处理的txt文档叫“手机号.txt”文档,并且所有的号码都是顶格写的,可以用下面这个代码:- @echo off
- for %%i in (手机号.txt) do set name=%%~ni
-
- findstr /b "13[4-9]" %name%.txt>%name%移动.txt
- findstr /b "15[0-2,7-9]" %name%.txt>>%name%移动.txt
- findstr /b "18[7,8]" %name%.txt>>%name%移动.txt
-
- findstr /b "13[0-2]" %name%.txt>%name%联通.txt
- findstr /b "15[5,6]" %name%.txt>>%name%联通.txt
- findstr /b "18[5,6]" %name%.txt>>%name%联通.txt
-
- findstr /b "133" %name%.txt>%name%电信.txt
- findstr /b "153" %name%.txt>>%name%电信.txt
- findstr /b "18[0,9]" %name%.txt>>%name%电信.txt
- pause
复制代码
作者: batman 时间: 2011-3-11 17:08
jm这么多次findstr效率不会高吧,不如用变量赋值法解决:- @echo off&setlocal enabledelayedexpansion
- for %%a in (139 138 137 136 135 134 159 158 157 152 151 150 188 187) do set "_%%a=移动"
- for %%a in(130 131 132 155 156 186 185) do set "_%%a=联通"
- for %%a in (133 153 180 189) do set "_%%a=电信"
- for /r %%a in (*.txt) do (
- for /f %%b in (%%a) do (
- set "str=%%b"&set "str=!str:~,3!"
- for %%c in (!str!) do >>%%~na_!_%%c!.txt echo %%b
- )
- )
复制代码
[ 本帖最后由 batman 于 2011-3-11 17:10 编辑 ]
作者: Hello123World 时间: 2011-3-11 17:11
- @echo off
- setlocal enabledelayedexpansion
- rem 假设某txt文档路径为c:\hello.txt
- for /f "usebackq delims=" %%i in ("c:\hello.txt") do (
- set a=%%i
- 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)
- for %%k in (130 131 132 155 156 186 185) do (if !a:~0,3!==%%k echo !a!>>c:\hello联通.txt)
- for %%l in (133 153 189 180) do (if !a:~0,3!==%%l echo !a! >>c:\hello电信.txt)
- )
- pause
-
复制代码
作者: namejm 时间: 2011-3-11 17:13
哈哈,其实每一条数据都用set来替换,效率更低,大量数据我一向是能避免替换就不替换。
作者: weichenxiehou 时间: 2011-3-11 20:49
我觉得jm的代码可以改为只执行三次findstr:- @echo off
- for %%i in (手机号.txt) do set name=%%~ni
- findstr "^13[4-9][0-9]*$ ^15[0-27-9][0-9]*$ ^18[78][0-9]*$" %name%.txt>%name%移动.txt
- findstr "^13[0-2][0-9]*$ ^15[56][0-9]*$ ^18[56][0-9]*$" %name%.txt>%name%联通.txt
- findstr "^133[0-9]*$ ^153[0-9]*$ ^18[09][0-9]*$" %name%.txt>%name%电信.txt
- pause>nul
复制代码
作者: wany_cao 时间: 2011-3-29 08:43
谢谢各位大侠赐教, 以上代码经过试验;
2楼 namejm 的代码可用
6楼 weichenxiehou 简化的二楼代码可用
3楼和4楼的不知为何,不能分离出来;运行立即自动结束 。
作者: wany_cao 时间: 2011-3-29 08:44
2# namejm
3Q ,方法可行
作者: hbwazxf 时间: 2011-3-29 09:01
新手学习了,批处理太牛了。。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |