Board logo

标题: [文本处理] (已解决)BAT如何提取无效号码及合计数量? [打印本页]

作者: 非常感谢    时间: 2013-9-6 15:39     标题: (已解决)BAT如何提取无效号码及合计数量?

本帖最后由 非常感谢 于 2013-9-7 18:38 编辑

批处理前:
2013年9月6日        +861111111111        00:06:09
2013年9月6日        +862222222222        00:04:01
2013年9月6日        +863333333333        00:00:00
2013年9月6日        +862222222222        00:00:00
2013年9月6日        +863333333333        00:00:00
2013年9月6日        +861111111111        00:06:22

合计:00:16:32



批处理后:(同一个号码打了两遍,一遍通,一遍不通,但视为有效号码.有效号码在下面不需要显示,只要合计就可以。)

2013年9月6日        +863333333333        00:00:00
合计无效号码数:1个
合计有效号码数:2个

作者: terse    时间: 2013-9-6 17:41

  1. @echo off&setlocal enabledelayedexpansion
  2. if "%~1" == "" (
  3.    for /f "tokens=1-3" %%a in ('%~s0 $ ^|sort /r') do (
  4.        if "%%a" == "00:00:00"  if not defined %%c (
  5.           set /a n+=1
  6.           set $!n!=%%b %%c %%a
  7.        )
  8.           set %%c=a
  9.    )
  10.       for /L %%i in (1,1,!n!) do echo !$%%i!
  11.       echo 合计无效号码数:!n! 个
  12.       pause&exit
  13. ) else for /f "tokens=1-3" %%i in (a.txt) do echo %%k %%i %%j
复制代码

作者: 非常感谢    时间: 2013-9-6 19:41

本帖最后由 非常感谢 于 2013-9-6 19:44 编辑

回复 2# terse

很抱歉。主题编辑了一下,拉掉了一个合计有效号码数功能。可以帮忙修正吗?还有是否可以导出为b.txt。万分感谢!!!
作者: PowerShell    时间: 2013-9-7 09:31

我又来 凿吧 两句,这类数据处理,大都是n行m列,这类问题用excel,或者内存数据库,来搞最好不过。
excel和数据库的用法其实类似。
如果是数据库,1导入文本到数据库。2用专业的数据查询命令sql命令,专业处理函数。3 导出结果。
如果是调用专业的数据库引擎接口,插入百万数据不慢,应该20秒以内。

你这个问题其实是,第二列,第三列的分类汇总问题,excel处理你这个数据后,第二列去重了,第三列汇总了,那么取第三列等于0的时间数据,既是无效号码。第二列的数据行数 - 无效号码 = 有效号码数
作者: 非常感谢    时间: 2013-9-7 11:57

回复 4# PowerShell


  txt里最多不会超过1000行,可以把上面的代码修正吗?谢谢!!!
作者: terse    时间: 2013-9-7 12:17

本帖最后由 terse 于 2013-9-7 20:21 编辑
  1. @echo off&setlocal enabledelayedexpansion
  2. if "%~1" == "" (
  3. set /a m=n=0
  4. (for /f "tokens=1-3" %%a in ('%~s0 #‘) do (
  5. if "%%a" == "00:00:00" (
  6. if not defined %%c set /a n+=1&echo %%b %%c %%a
  7. ) else for /f "tokens=1-3 delims=:" %%i in ("%%a") do (
  8. set /a hh+=1%%i-100,mm+=1%%j-100,ss+=1%%k-100
  9. if not defined %%c set /a m+=1
  10. )
  11. set %%c=a
  12. )
  13. echo 合计无效号码数:!n! 个&echo 合计有效号码数:!m! 个)>b.txt
  14. pause&exit
  15. ) else (for /f "tokens=1-3" %%i in (a.txt) do @if not %%k# == # @echo %%k %%i %%j)|sort /r
复制代码

作者: terse    时间: 2013-9-7 12:21

本帖最后由 terse 于 2013-9-7 15:46 编辑

暂不确定 文本分隔符和字符数是否固定 所以不知能用否
这样效率提升点不
  1. @echo off&setlocal enabledelayedexpansion
  2. (set /a m=n=0
  3. for /f "tokens=1-3" %%a in ('more /T20 a.txt^|sort /+35 /r') do (
  4. if "%%c" neq "" (
  5. if "%%c" == "00:00:00" (
  6. if not defined %%b set /a n+=1&echo %%a %%b %%c
  7. ) else if not defined %%b  set /a m+=1
  8. set %%b=0
  9. )
  10. )
  11. echo 合计无效号码数:!n! 个&echo 合计有效号码数:!m! 个)>b.txt
  12. pause
复制代码

作者: 非常感谢    时间: 2013-9-7 14:20

回复 7# terse

主题批处理前:增加了一个合计时间

上面您给的两个代码都测试了,非常成功,只是每次处理前先要手动删除那个主题里的合计时间。再用您给的批处理执行,执行过程如图:命令语法不正确。但b.txt结果都有。 没能在主题里一次说清问题,很抱歉,最后谢谢您的热心帮助!
作者: terse    时间: 2013-9-7 15:44

回复 8# 非常感谢
上面已修改
作者: terse    时间: 2013-9-7 20:23

回复 10# 非常感谢

这里把 $' 字符吃了
作者: 非常感谢    时间: 2013-9-30 18:35

本帖最后由 非常感谢 于 2013-9-30 18:46 编辑

回复 7# terse
原因找到了,谢谢!
批处理前如果:日期和号码和通话之间的(间距)只有一个或2个空格的话,会出现错误的数据结果

2013年9月6日 +861111111111 00:06:09
2013年9月6日 +862222222222 00:04:01
2013年9月6日 +863333333333 00:00:00
2013年9月6日 +862222222222 00:00:00
2013年9月6日 +863333333333 00:00:00
2013年9月6日 +861111111111 00:06:22

合计:00:16:32

-------------------------------------

2013年9月6日 +863333333333 00:00:00
2013年9月6日 +862222222222 00:00:00
合计无效号码数:2 个
合计有效号码数:2 个


------------------------------------------------
6楼的代码没问题。




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