Board logo

标题: [文本处理] (已解决)批处理如何提取文本中的电话号码并及删除重复号 [打印本页]

作者: 非常感谢    时间: 2013-11-10 16:00     标题: (已解决)批处理如何提取文本中的电话号码并及删除重复号

本帖最后由 pcl_test 于 2016-7-15 17:59 编辑

文件夹下有一些txt文本,内容大同小异,需要批量处理,谢谢大家帮忙!
批处理前:思路是先只保留电话那一行,对其按类纵向排列,然后去掉中文和符号,及重复行过滤。请看批处理后的结果。
25 公里
? 2013 - GS(2012)6003号 - Data ? NavInfo & CenNavi & 道道通
共有593条结果


        地址:

电话:010-3333333
电话:(020)7777777, (020)88888888
加入收藏夹
地址:钟村镇
   
         电话:(020)99999999
加入收藏夹
首页<上一页891011下一页>
地址:广场街1
地址:十八甫北路17

电话:010-11111111, 010-222222222
电话:010-11111111, 010-222222222
电话:010-11111111, 010-222222222

批处理后:
01011111111
010222222222
0103333333
0207777777
02088888888
02099999999

作者: xxpinqz    时间: 2013-11-10 21:56

  1. @echo off
  2. for /f "delims=" %%i in ('findstr /i "电话:" a.txt') do (
  3.     for /f "tokens=2-5 delims=:(),- " %%a in ("%%i") do (
  4.         set #%%a%%b=.
  5.         set #%%c%%d=.
  6.     )
  7. )
  8. for /f "delims=#=." %%a in ('set #') do echo,%%a
  9. pause
复制代码

作者: 非常感谢    时间: 2013-11-10 23:22

回复 2# xxpinqz

电话:         (0471)4444444
电话:         (0471)4444444
电话:(0833)55555555
电话:(0833)55555555
没想到主题里面有上面号码的话,批处理后:0833正常,0471不正常。
        0471
01011111111
010222222222
0103333333
0207777777
02088888888
02099999999
083355555555
4444444
作者: 非常感谢    时间: 2013-11-10 23:38

回复 3# 非常感谢
也有很多零碎的数字出现。为了把问题说清楚,我把附件上传了,谢谢您!
        0311
        0312
        0351
        03513012525
        0371
        0376
        0378
        03782827566
        03782905373
        0379
        0411
        0431
        043187938111
        0432
        0433
        04332760188
        0452
        0453
879169690431
87943099
87959593
87970500
87976067
87981117
88081416
8820120
88598120
88751333
88761319
88786396
88789999
8879688888766107
89176600
89363999
89615660
89671111
作者: 非常感谢    时间: 2013-11-11 00:45

本帖最后由 非常感谢 于 2013-11-11 00:51 编辑

回复 2# xxpinqz

自己研究了一下,大概下面这几个格式会出现零碎的数字排列。因为逗号后面的数字有些不带区号,纵向排列后,分不清楚是哪的了。
电话:(0452)2415555, 4006579989
电话:(023)67456745, 67259555
电话:025-84620871, 65018888
电话:         (0471)4444444
是否可以这样,先将保留的电话那一行,逗号后半部分删除,然后对逗号前半部分删除中文和符号?至于0471那个格式,希望还是保留号码,,,谢谢了。
作者: terse    时间: 2013-11-11 01:21

那逗号后面的号码要吗?
还有 电话:(022)26419999-8656  后面的 8656 怎么处理
如能把问题一次说清楚 至少可以减少更改代码的次数
作者: 非常感谢    时间: 2013-11-11 04:23

本帖最后由 非常感谢 于 2013-11-11 04:25 编辑

回复 6# terse
1.逗号后面的号码全部不要了,缺了区号,失去意义了
2.8656 留着好了。
没能看全文件里的号码格式的多样性,抱歉了,不过上面的代码对我学习还是有帮助的,,,上传的附件是一部分,希望您参考!谢谢您!
作者: terse    时间: 2013-11-11 10:45

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1* delims=:" %%i in ('findstr /i "电话:" a.txt') do (
  3.     set str=%%j
  4.     set "str=!str:(=!"
  5.     for %%a in (!str:(^=!) do (
  6.         set "str=%%a"
  7.         if "!str:)=!" neq "!str!" (
  8.            set "str=!str:)=!"
  9.            echo !str!
  10.         ) else if "!str:-=!" == "!str!" (
  11.                if "!str:~10!" neq "" echo !str!
  12.           ) else echo !str:-=!
  13.     )
  14. )
  15. pause
复制代码

作者: 非常感谢    时间: 2013-11-11 12:03

回复 8# terse
简单测试了一下,貌似少了重复行过滤,下面是我测试后的数据。
0103333333
0207777777
02088888888
02099999999
01011111111
010222222222
01011111111
010222222222
01011111111
010222222222
04714444444
04714444444
083355555555
083355555555
02361560471
作者: terse    时间: 2013-11-11 13:21

回复 9# 非常感谢
恩 没有对重复项处理 修改之
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1* delims=:" %%i in ('findstr /i "电话:" a.txt') do (
  3.     set s=&set str=%%j
  4.     set "str=!str:(=!"
  5.     for %%a in (!str:(^=!) do (
  6.         set "str=%%a"
  7.         if "!str:)=!" neq "!str!" (
  8.            set "s=!str:)=!"
  9.         ) else if "!str:-=!" == "!str!" (
  10.                if "!str:~10!" neq "" set "s=!str!"
  11.           ) else set "s=!str:-=!"
  12.             if "!s!" neq "" if not defined $!s! echo !s!&set $!s!=$
  13.     )
  14. )
  15. pause
复制代码

作者: 非常感谢    时间: 2013-11-11 14:26

回复 10# terse

7楼有一句:8656 留着好了。
我想知道您代码的那一行决定着它的去留?如果要去掉它,是否只需改动一行代码,想学习和了解一下。
作者: DAIC    时间: 2013-11-11 14:41

回复 11# 非常感谢


    你对比一下8楼和10楼的代码就看到了吧
作者: terse    时间: 2013-11-11 14:44

本帖最后由 terse 于 2013-11-11 14:46 编辑

回复 11# 非常感谢
代码前11行都处理好了
如果要去掉这个貌似分机号的 可以11行后加上
  1. for /f %%j in ("!s:-= !") do set s=%%j
复制代码

作者: suseek    时间: 2013-11-12 22:37

回复10楼
第5行往下能解释一下吗,没太看明白
谢谢




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2