Board logo

标题: [文本处理] 将文本中的内容按要求格式化并按指定列的用时数排序和统计总用时数 [打印本页]

作者: 非常感谢    时间: 2013-9-26 17:47     标题: 将文本中的内容按要求格式化并按指定列的用时数排序和统计总用时数

本帖最后由 pcl_test 于 2017-4-30 23:04 编辑

批处理:当日合计
批处理前:
日期、时间 项目 类别 费率 已用量 信用点数金额*

9-26 08:55 +111111111111 , China  通话
  ? 0.000 00:00 ? 0.000
9-26 08:54 +222222222222 , China  通话
  ? 0.000 00:00 ? 0.000
9-26 08:52 +333333333333 , China  通话
  ? 0.000 11:11 ? 0.000
9-26 08:52 +444444444444 , China  通话
  ? 0.000 00:08 ? 0.000

批处理后:

2013年9月26日        +333333333333        00:11:11
2013年9月26日        +444444444444        00:00:08
2013年9月26日        +111111111111        00:00:00
2013年9月26日        +222222222222        00:00:00

合计:0:11:19
作者: batman    时间: 2013-9-26 21:03

本帖最后由 batman 于 2013-9-26 21:05 编辑
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "skip=1 delims=" %%a in (a.txt) do (
  3.   set /a n+=1
  4.   if not defined str (
  5.     for /f "tokens=1,2,4 delims=- " %%b in ("%%a") do set "str=%date:~,4%年%%b月%%c日 %%d"
  6.     ) else (
  7.     for /f "tokens=3,4 delims=: " %%b in ("%%a") do (
  8.       set "_%%b%%c_!n!=!str! %%b:%%c"&set "str="
  9.       set /a m+=1%%b %% 100,s+=1%%c %% 100
  10.       if !s! gtr 60 set /a s-=60,m+=1
  11.       if !m! gtr 60 set /a m-=60,h+=1
  12.     )
  13.   )
  14. )
  15. for /f "tokens=2 delims==" %%a in ('set _^|sort /r') do echo,%%a
  16. for %%a in (h m s) do set "%%a=00!%%a!"&set "%%a=!%%a:~-2!"
  17. echo,合计:%h%:%m%:%s%
  18. pause>nul      
复制代码

作者: 非常感谢    时间: 2013-9-26 21:35

回复 2# batman
可以修改成导出为b.txt吗?,
还有显示的时间格式不太对。(就是每个时间前面少00:)
2013年9月26日        +333333333333        11:11
2013年9月26日        +444444444444        00:08
2013年9月26日        +111111111111        00:00
2013年9月26日        +222222222222        00:00

合计:0:11:19
------------------------------------------
2013年9月26日        +333333333333        00:11:11
2013年9月26日        +444444444444        00:00:08
2013年9月26日        +111111111111        00:00:00
2013年9月26日        +222222222222        00:00:00

合计:0:11:19
作者: batman    时间: 2013-9-26 23:18

不接待纯伸手党!
楼主在论坛发求助帖N个了,居然连写入文本都没学会,自己说说吧。。。
作者: 非常感谢    时间: 2013-9-27 07:01

本帖最后由 非常感谢 于 2013-9-27 07:57 编辑

回复 4# batman


    什么都不懂,什么都不会,发求助帖子就不行吗?说实话对批处理,本人是完全外行,但论坛有太多热心人,才愿意来,也比较喜欢论坛,查看了一下我所有的帖子,主题全部数量17个,算n个吧。在n个里面,  版主直接帮助回答的帖子并不是多数,怎么就变成了伸手党了呢?早上醒来,心里不太是滋味,版主叫我说说看,那我就说说,任何人一生掌握的东西都是有限的,有的人跑步行,不一定游泳厉害,或者是料理也行,再或者是乐器也懂,电脑硬件,软件,计算机语言厉害,不见得其他领域也有成就。发求助帖子,态度认真和诚恳就好了嘛,谁叫不懂呢,?又能怪谁呢?,但做为版主,管理论坛,是不是应该以宽容的心态,热心的态度和高超的技术维持呢,这个帖子,谁看到了,愿意帮就帮,啥也不说了,就说这么多,,,,,,
作者: DAIC    时间: 2013-9-27 09:14

你可以先回顾一下这几个帖子,看看别人是如何写入文件的。
http://bbs.bathome.net/thread-26288-1-1.html
http://bbs.bathome.net/thread-26365-1-1.html
http://bbs.bathome.net/thread-25951-1-1.html
http://bbs.bathome.net/thread-25896-1-1.html
http://bbs.bathome.net/thread-25908-1-1.html
然后自己尝试一下。
如果搞不定的话,我可以帮忙修改。
作者: 非常感谢    时间: 2013-9-27 09:59

本帖最后由 非常感谢 于 2013-9-27 12:08 编辑

回复 6# DAIC
基本都是最后加)>b.txt,我试过了都不成功。关键是看不懂,下了水,不会游泳,没办法。
把上面代码为a.bat,在cmd下执行 a.bat > b.txt  也能导出结果b.txt 但这不是理想办法,太麻烦!还有就是代码需要修改。(就是每个时间前面少00:)
作者: DAIC    时间: 2013-9-27 10:26

回复 7# 非常感谢


echo命令是用来输出结果的
你在2楼代码的echo命令的行结尾加上>>b.txt
试试
作者: 非常感谢    时间: 2013-9-27 10:48

回复 8# DAIC

试过不行,还有2楼代码输出时间格式少00:
您可以用主题里的内容和代码一起试验一下,谢谢!!
作者: terse    时间: 2013-9-27 12:20

回复 9# 非常感谢
难度到不是很大 只是按给出的范例处理后是否还有后续问题
比如如果一个文本有多个号码是全部显示吗
以及文本里只有当天的信息 还是只处理当天信息 有不是当天的信息吗
小时数会超过2位数不? (文本并没显示小时)
作者: DAIC    时间: 2013-9-27 12:56

回复 9# 非常感谢


请把你修改过的代码贴出来看看,我帮你改。
作者: batman    时间: 2013-9-27 13:04

本帖最后由 batman 于 2013-9-27 13:09 编辑

我算是看透了你们这种不爱动脑子的伸手党。。。
输出少了00:,这个很容易在代码中加上的,但是按你原来的文本格式,这个有意义?
重定向到文本是批基础中的基础,你如果是头一两次发帖,你不会,我可以理解,发了这么多求助帖还不会,只说明了一个问题,你只要100%达到自己的要求,至于别人怎么实现你不管也不去想,更谈不上学习,只是在这里把自己当社会上的“甲”方看?
对不起,本人乐于助人,但不乐于助懒人,更不乐于助狂人。。。
作者: foxJL    时间: 2013-9-27 13:48

赞成batman的说法,我想当初站长建立论坛旨在为批处理爱好者提供一个讨论的地方,而不是为有需求的人免费提供代码。如果你是批处理爱好者大家共同探讨我们都热烈欢迎,如果只是单纯要代码,请去隔壁『有偿求助区』发贴求助。
作者: 非常感谢    时间: 2013-9-27 14:32

回复 10# terse
1.是当天的,txt里看了一下批处理前是1000多行,批处理后当然是几百行了。
2.为什么需要00:,因为当日合计后,对b.txt还需要提取无效号码,就是您以前给的批处理,如果不是这个格式00:00:00,无法提取无效号码。
作者: 非常感谢    时间: 2013-9-27 14:53

本帖最后由 非常感谢 于 2013-9-27 15:14 编辑

回复 12# batman

本人都表达了完全是零基础,根本就看不懂代码,您说懒,懒是对有能力,而不去做的人吧,您说不爱动脑子,根本就没有思路,看不懂怎么修改代码。(输出少了00:,这个很容易在代码中加上的)这个对您来讲易如反掌,对我而言根本就不知道在哪里加和怎么加,百度了几个小时,没找到答案。两位版主的想法--我也不想去否定,只是每个人的立场不一样,我只能说您愿意帮就帮,不帮我也不说什么,如果您的批评对我有提高脚本知识的话,那我谢谢您!这个帖子没想到变的越来越奇怪了,,,学习是渐进的,对于刚学会爬的小孩,要求他走路或跑,不太适合,这是我的观点。学批处理我连爬也是刚开始,,,,,,,不多说了。
作者: terse    时间: 2013-9-27 14:53

本帖最后由 terse 于 2013-9-27 16:26 编辑
  1. @echo off&setlocal enabledelayedexpansion
  2. if "%~1" == "" (
  3. set d=%date:~,4%年
  4. (for /f "tokens=1*" %%i in ('%~s0 $ ^|sort/r') do (
  5. echo %%j %%i
  6. for /f "tokens=1-3 delims=:" %%a in ("%%i") do (
  7. set /a h+=1%%a-100,m+=1%%b-100,s+=1%%c-100
  8. )
  9. )
  10. set /a m+=s/60,h+=m/60,s%%=60,m%%=60
  11. for %%a in (h m s) do if !%%a! lss 10 set %%a=0!%%a!
  12. echo,合计:!h!:!m!:!s!)>b.txt
  13. exit
  14. ) else for /f "skip=1tokens=1-3" %%a in (a.txt) do (
  15.    if "%%c" lss "0" (
  16. for /f "delims=-.:/\ tokens=1-2" %%i in ("%%a") do (
  17. set "str=%d%%%i月%%j日 %%c"
  18. )
  19.    ) else for /f "tokens=1-3 delims=:" %%i in ("%%i") do (
  20.                        if "%%k" == "" (set h=00:) else set "h="
  21.                        echo !h!%%c !str!
  22.                   )
  23.        )
复制代码

作者: batman    时间: 2013-9-27 15:10

回复 15# 非常感谢


    那能否请楼主谈谈,你在批处理之家学到了什么知识,怎么样才能让你学会重定向到文本这一基础操作?
作者: 非常感谢    时间: 2013-9-27 15:20

本帖最后由 foxJL 于 2013-9-27 15:32 编辑

回复 8# DAIC
  1. @echo off >b.txt
  2. @echo off&setlocal enabledelayedexpansion
  3. for /f "skip=1 delims=" %%a in (a.txt) do (
  4.   set /a n+=1
  5.   if not defined str (
  6.     for /f "tokens=1,2,4 delims=- " %%b in ("%%a") do set "str=%date:~,4%年%%b月%%c日 %%d"
  7.     ) else (
  8.     for /f "tokens=3,4 delims=: " %%b in ("%%a") do (
  9.       set "_%%b%%c_!n!=!str! %%b:%%c"&set "str="
  10.       set /a m+=1%%b %% 100,s+=1%%c %% 100
  11.       if !s! gtr 60 set /a s-=60,m+=1
  12.       if !m! gtr 60 set /a m-=60,h+=1
  13.     )
  14.   )
  15. )
  16. for /f "tokens=2 delims==" %%a in ('set _^|sort /r') do echo,%%a
  17. for %%a in (h m s) do set "%%a=00!%%a!"&set "%%a=!%%a:~-2!"
  18. echo,合计:%h%:%m%:%s% >>b.txt
  19. pause>nul
复制代码

作者: 非常感谢    时间: 2013-9-27 15:28

回复 17# batman


    我相信这个帖子会让我学会重定向,再过1,2年也能看懂您写的代码(不是难度大的)就可以了,,,,
作者: 非常感谢    时间: 2013-9-27 15:44

回复 16# terse
2013年9月26日 +333333333333 11:11
2013年9月26日 +444444444444 00:08
2013年9月26日 +222222222222 00:00
2013年9月26日 +111111111111 00:00
合计:00:11:19

---------------------------------------
用主题里的4个号码做了测试,,,估计是时间格式00:00:00问题     提取无效号码后的图片
作者: DAIC    时间: 2013-9-27 15:46

回复 18# 非常感谢


    第16行还有一个echo
作者: DAIC    时间: 2013-9-27 15:47

回复 19# 非常感谢


论坛有重定向的教程
http://www.bathome.net/thread-3296-1-1.html
作者: 非常感谢    时间: 2013-9-27 16:05

回复 21# DAIC

谢谢您,2楼脚本的导出b.txt学会了,,,,,,今天真高兴。也谢谢batman.
>>b.txt
作者: terse    时间: 2013-9-27 16:20

本帖最后由 terse 于 2013-9-27 16:27 编辑

回复 20# 非常感谢
怎么测试的 最好贴出代码 以便更快的解决问题 或者是无效号码的标志是什么
前面代码已修改 添加显示小时
作者: 非常感谢    时间: 2013-9-27 18:49

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

回复 24# terse

http://www.bathome.net/viewthread.php?tid=26288&highlight=

无效号码的标准是。一个号码的打3遍,通1遍,2遍不通算有效号码。打3遍,3遍不通算无效。脚本您以前给过了。上面是地址
下面是您给的代码:代码第五行去掉00:就可以用了。
@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

  --------------------------------------------------------------------------------------------------------
谢谢您!!!




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