标题: [文本处理] (已解决)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
- @echo off&setlocal enabledelayedexpansion
- if "%~1" == "" (
- for /f "tokens=1-3" %%a in ('%~s0 $ ^|sort /r') do (
- if "%%a" == "00:00:00" if not defined %%c (
- set /a n+=1
- set $!n!=%%b %%c %%a
- )
- set %%c=a
- )
- for /L %%i in (1,1,!n!) do echo !$%%i!
- echo 合计无效号码数:!n! 个
- pause&exit
- ) 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 编辑
- @echo off&setlocal enabledelayedexpansion
- if "%~1" == "" (
- set /a m=n=0
- (for /f "tokens=1-3" %%a in ('%~s0 #‘) do (
- if "%%a" == "00:00:00" (
- if not defined %%c set /a n+=1&echo %%b %%c %%a
- ) else for /f "tokens=1-3 delims=:" %%i in ("%%a") do (
- set /a hh+=1%%i-100,mm+=1%%j-100,ss+=1%%k-100
- if not defined %%c set /a m+=1
- )
- set %%c=a
- )
- echo 合计无效号码数:!n! 个&echo 合计有效号码数:!m! 个)>b.txt
- pause&exit
- ) 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 编辑
暂不确定 文本分隔符和字符数是否固定 所以不知能用否
这样效率提升点不- @echo off&setlocal enabledelayedexpansion
- (set /a m=n=0
- for /f "tokens=1-3" %%a in ('more /T20 a.txt^|sort /+35 /r') do (
- if "%%c" neq "" (
- if "%%c" == "00:00:00" (
- if not defined %%b set /a n+=1&echo %%a %%b %%c
- ) else if not defined %%b set /a m+=1
- set %%b=0
- )
- )
- echo 合计无效号码数:!n! 个&echo 合计有效号码数:!m! 个)>b.txt
- 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 |