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

[文本处理] [已解决]批处理怎样对手机号码归属地数据进行筛选?

数据下载(更新了地址及quhao.txt)
http://www.rayfile.com/files/bd808cca-58db-11df-98b5-0015c55db73d/

说明:
1.第一个原始数据文件data.txt内含有20万条数据(中间以tab分隔),文件大小超过8MB
2.第二个quhao.txt文件有300多条数据(中间以空格分隔),文件大小不到5KB

==============================================================================
1.原始数据
手上有一个比较详尽的手机号码归属地数据文件data.txt,格式如下(中间以tab分隔)
1534960 宁夏银川 电信CDMA卡
1534961 宁夏银川 电信CDMA卡
1534967 宁夏银川 电信CDMA卡
1534968 宁夏银川 电信CDMA卡
1534969 宁夏银川 电信CDMA卡
1534970 青海西宁 电信CDMA卡
1534971 青海西宁 电信CDMA卡
1534972 青海西宁 电信CDMA卡
1534973 青海西宁 电信CDMA卡
1534974 青海西宁 电信CDMA卡
1534975 青海海东 电信CDMA卡
1534976 青海海东 电信CDMA卡
1534977 青海海西 电信CDMA卡
1534978 青海共和 电信CDMA卡
1534979 青海格尔木 电信CDMA卡
1534985 安徽巢湖 电信CDMA卡
1534986 安徽六安 电信CDMA卡
1534987 安徽六安 电信CDMA卡
多数为三段(多数号码是连续的,前后仅相差1,但部分号码不是连续的)

1566023 广东佛山 联通 GSM卡
1864353 吉林通化 联通WCDMA 3G卡
1881943 广东广州 移动TD-SCDMA 3G卡
1892413 广东广州 电信天翼  3G卡
部分数据为四段数据


2.数据精简
预将上述数据中,归属地相同的连续号码,精简为号段形式,并删掉手机卡类型,输出格式如下:
1534960 宁夏银川
1534962 未知
1534967 宁夏银川
1534970 青海西宁
1534975 青海海东
1534977 青海海西
1534978 青海共和
1534979 青海格尔木
1534980 未知
1534985 安徽巢湖
1534986 安徽六安

精简的目的就是极大地减小数据量,仅表示该号段第一个号码,所有大于第一个号码的均视为同一个归属地
解释为:1534960~1534961 宁夏银川,1534962~1534966 未知1534967~1534969 宁夏银川,1534970~1534974 青海西宁……

data.txt中多数号码是连续的,前后仅相差1
但部分不是连续的号码,应增加一行内容为“最后一个连续号码+1 空格 未知”,见增加的蓝色内容

如:1534961、1534963、1534967不是连续的,因此应增加“1534961+1 空格 未知”,即“1534962 未知
       若不加“1534962 未知”,则会误认为1534962与1534961归属相同




3.更改归属地名称为区号代码
另有一个quhao.txt文件,格式如下(中间以空格分隔)
111 未知
564 安徽六安
565 安徽巢湖
951 宁夏银川
971 青海西宁
972 青海海东
977 青海海西
979 青海格尔木

将刚才第二步精简后的数据中,参考quhao.txt,将对应的归属地名称改为区号代码,最终输出格式如下(中间以空格分隔)
1534960 951
1534962 111
1534967 951
1534970 971
1534975 972
1534977 977
1534978
1534979 979
1534980 111
1534985 565
1534986 564

quhao.txt中没有1534978对应的“青海共和”,所以后面为空(便于今后补充)


4.结果输出
如果最后结果文件大小不到5KB,显然把所有归属相同的都精简了,每个地区只剩一个号段了
最终结果文件大小应该超过600KB才合理


结果应该是这种格式(从小到大排列)
1300000 10
1300001 519
1300002 565
1300003 111
1300006 25
1300007 111
1300008 27
1300009 111
1300010 10
1300012 22
1300015 533
1300016 535
1300017 531
1300018 22
1300020 21
1300025 25
1300027 535
1300028 25
1300033 510
1300040 20
1300045 10

data20100506.rar 于 2010-5-6 14:48  更新
http://pan.baidu.com/share/link?shareid=4185092398&uk=1124163200
1

评分人数

    • Batcher: 感谢主动给标题标注[已解决]字样PB + 2

感谢帮助过我的热心新

没想到在批处理之家有这么多的热心人,在这里对所有帮助过我的人表示由衷的谢意!

按出场顺序排列:
CUer
yangfengoo
hanyeguxing
netbenton版主
namejm管理员
随风 超级版主
qzwqzw
neorobin
Batcher管理员



感谢CUer,不计其数的帮我完善代码,最终运行成功!
netbenton版主的第一版代码除了没有“未知”地外,结果也正确,速度很快
namejm管理员、随风 超级版主的第一版代码为了满足我显示过程的要求,速度稍慢
yangfengoo、hanyeguxing、qzwqzw也为我编写并修改了代码



再次谢谢!

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

TOP

  1. gawk "!($2 in a){a[$2];$3=\"\";print}" yuanshi.txt >jingjian.txt
  2. gawk "NR==FNR{a[$2]=$1}NR>FNR{print a[$2],$1}" jingjian.txt quhao.txt >result.txt
复制代码

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1,2" %%a in (quhao.txt) do set #%%b=%%a
  3. (for /f "tokens=1,2" %%a in (data.txt) do echo.%%a !#%%b!)>>结果.txt
复制代码
9M测试不到1分钟

TOP

谢谢二楼高手的相助!
试了一下,输出的jingjian.txt和result.txt都是空的

单独运行第一行代码输出的jingjian.txt也是空的

TOP

三楼的代码没有对数据进行精简吧?
而且两个文件的分隔符不同,tab和空格,这个有影响吗?

我测试后输出结果为空

TOP

C:\Test>gawk "!($2 in a){a[$2];$3=\"\";print}" yuanshi.txt >jingjian.txt

C:\Test>gawk "NR==FNR{a[$2]=$1}NR>FNR{print a[$2],$1}" jingjian.txt quhao.txt >result.txt

C:\Test>type result.txt
1354910 753
1354920 769
1354950 735
1354960 736
1354964 731

C:\Test>gawk --version
GNU Awk 3.1.6
Copyright (C) 1989, 1991-2007 Free Software Foundation.

TOP

原帖由 jack1505 于 2010-5-5 12:12 发表
三楼的代码没有对数据进行精简吧?
而且两个文件的分隔符不同,tab和空格,这个有影响吗?

我测试后输出结果为空


我直接复制的,第一和二个都是空格分割。

TOP

tab,空格分割兼容
  1. @echo off&setlocal enabledelayedexpansion
  2. echo.%time%
  3. for /f "tokens=1,2" %%a in (quhao.txt) do set #%%b=%%a
  4. (for /f "tokens=1,2 delims=  " %%a in (data.txt) do echo.%%a !#%%b!)>>结果.txt
  5. echo.%time%
  6. pause
复制代码

[ 本帖最后由 yangfengoo 于 2010-5-5 12:37 编辑 ]

TOP

注意 delims=
后面是一个tab键和一个空格键  直接复制代码不行,论坛对tab键做了处理

TOP

原帖由 CUer 于 2010-5-5 12:14 发表
C:\Test>gawk "!($2 in a){a[$2];$3=\"\";print}" yuanshi.txt >jingjian.txt

C:\Test>gawk "NR==FNR{a[$2]=$1}NR>FNR{print a[$2],$1}" jingjian.txt quhao.txt >result.txt

C:\Test>type result.txt
135491 ...


再次感谢!刚才是因为缺少gawk.exe,所以输出为空

但现在运行又有新问题了,提示
Invalid keyboard code specified
Program too big to fit in memory

增加运行smartdrv也不行啊

TOP

你的gawk版本是多少?
在gawk上面加一句chcp 936行吗?
在gawk上面加一句chcp 437行吗?

TOP

原帖由 CUer 于 2010-5-5 12:55 发表
你的gawk版本是多少?
在gawk上面加一句chcp 936行吗?
在gawk上面加一句chcp 437行吗?


刚才下了新版本,可以输出了,不为空
但结果不对

jingjian.txt内容只有一行
1300000 北京ഠ
结尾是一个黑色方块

result.txt内容只有区号,没有手机号段
10
20
21
22
23
24
25
27
28
298
293
310
311
312
313
314
315
316
317

均为:空格+区号

======================================
是不是Tab和空格没有区分的原因?

[ 本帖最后由 jack1505 于 2010-5-5 14:20 编辑 ]

TOP

回复yangfengoo

改为delims= tab空格
输出依然为空,怎么回事呢?

echo.%time%只是显示时间,不是显示进度(这个功能没有也罢)

TOP

按电话区号分组排列手机区段:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1,2" %%a in (data.txt) do (if not "%%b"=="!b!" set @%%b@%%a=a
  3. echo.正在预处理%%a %%b&set b=%%b)
  4. echo.正在进行后期处理...
  5. for /f "tokens=1,2" %%a in (quhao.txt) do set @%%b#%%a=b
  6. (for /f "tokens=2,3 delims==@#" %%a in ('set @') do if %%b==b (set a=%%a) else echo.%%a !a!)>结果.txt
  7. echo.已经完成&pause
复制代码
如果想加快处理速度,不看到处理过程,则:
  1. @echo off&setlocal enabledelayedexpansion&echo.正在处理中。。。
  2. for /f "tokens=1,2" %%a in (data.txt) do (if not "%%b"=="!b!" set @%%b@%%a=a
  3. set b=%%b)
  4. for /f "tokens=1,2" %%a in (quhao.txt) do set @%%b#%%a=b
  5. (for /f "tokens=2,3 delims==@#" %%a in ('set @') do if %%b==b (set a=%%a) else echo.%%a !a!)>结果.txt
复制代码

[ 本帖最后由 hanyeguxing 于 2010-5-5 17:47 编辑 ]
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

返回列表