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

【出题】批处理给文本文件ab cd.txt每行前加上日期

出题:给ab cd.txt每行前加上日期
已知:
   ab cd.txt 文件名含空格。(不能改文件名)
   ab cd.txt 行数不确定 (大约5万行左右),无空行,且不含特殊符号。
.
要求:
   1、给ab cd.txt每行前面加上日期,将结果写入 c.txt
   2、最后一行为当前日期,倒数第二行为昨天的日期,倒数第三行为前天的日期,依此类
推。。。。
   3、并在跨月份时插入空行。
   如:09月30日 和 10月01日 之间需插入一空行。
  1.    2008年09月28日 为什么要学习批处理
  2.    2008年09月29日 1.源自于批处理的简单
  3.    2008年09月30日 我想没有多少人愿意花上一个月甚至更多的时间
  4.    2008年10月01日 去绞尽脑汁的专门学习一个编程语言来写一个删除系统垃圾的程序,
  5.    2008年10月02日 因为对于一个不是专门学习计算机或者将来从事这方面工作的人来说,
  6.    2008年10月03日 这样的投入与产出实在是不值得的,
  7.    2008年10月04日 而用我们的批处理只要几分钟就可以解决这个问题,
复制代码
代码要求:
  1、不产生临时文件
  2、用纯p解决。
  3、必须考虑跨年度、跨月份、及闰年的情况。
  4、代码运行耗时不能超过一分钟。
.
加分条件:
   1、效率高   +5
   2、代码简洁 +3
   3、满分    +10
.

假设ab cd.txt内容为:
  1. 为什么要学习批处理
  2. 1.源自于批处理的简单
  3. 我想没有多少人愿意花上一个月甚至更多的时间
  4. 去绞尽脑汁的专门学习一个编程语言来写一个删除系统垃圾的程序,
  5. 因为对于一个不是专门学习计算机或者将来从事这方面工作的人来说,
  6. 这样的投入与产出实在是不值得的,
  7. 而用我们的批处理只要几分钟就可以解决这个问题,
  8. 这样的方便性让任何对计算机望而生畏的人来说是多么的有吸引力。
  9. 2.通过批处理的编写,会逐渐的熟悉windows操作系统的一些细节问题,
  10. 仅此一点就能让你在众多菜鸟中脱颖而出。
  11. 3.通过diy自己的“程序”让自己有种成就感,
  12. 这种感觉绝对不是使用别人的工具所能言语的,
  13. 自己能写出来东西就是对自己最好的证明。
  14. 4.强大性,baidu,google里不可能搜索到能帮你解决掉所有问题的程序,
  15. 如果你不会写那些.exe程序,
  16. 那么你要完成你的目标可能就要花些银子让一些软件工作室帮你写咯。
  17. 其实决大部分系统的问题,.bat都可以轻松的帮你解决掉了。
  18. 说了这么多,到底为什么要学习批处理就是很简单的一句话:
  19. 程序是写出来满足绝大部分人的,而批处理是满足我们自己的。
  20. 每个拥有计算机和懂计算机的人都应该学习批处理。
  21. 因为世界上任何一个人都能通过简单的学习掌握批处理这门“编程语言”
复制代码
假设当前日期为: 2008年10月18日
要求 c.txt 结果如下:
  1. 2008年09月28日 为什么要学习批处理
  2. 2008年09月29日 1.源自于批处理的简单
  3. 2008年09月30日 我想没有多少人愿意花上一个月甚至更多的时间
  4. 2008年10月01日 去绞尽脑汁的专门学习一个编程语言来写一个删除系统垃圾的程序,
  5. 2008年10月02日 因为对于一个不是专门学习计算机或者将来从事这方面工作的人来说,
  6. 2008年10月03日 这样的投入与产出实在是不值得的,
  7. 2008年10月04日 而用我们的批处理只要几分钟就可以解决这个问题,
  8. 2008年10月05日 这样的方便性让任何对计算机望而生畏的人来说是多么的有吸引力。
  9. 2008年10月06日 2.通过批处理的编写,会逐渐的熟悉windows操作系统的一些细节问题,
  10. 2008年10月07日 仅此一点就能让你在众多菜鸟中脱颖而出。
  11. 2008年10月08日 3.通过diy自己的“程序”让自己有种成就感,
  12. 2008年10月09日 这种感觉绝对不是使用别人的工具所能言语的,
  13. 2008年10月10日 自己能写出来东西就是对自己最好的证明。
  14. 2008年10月11日 4.强大性,baidu,google里不可能搜索到能帮你解决掉所有问题的程序,
  15. 2008年10月12日 如果你不会写那些.exe程序,
  16. 2008年10月13日 那么你要完成你的目标可能就要花些银子让一些软件工作室帮你写咯。
  17. 2008年10月14日 其实决大部分系统的问题,.bat都可以轻松的帮你解决掉了。
  18. 2008年10月15日 说了这么多,到底为什么要学习批处理就是很简单的一句话:
  19. 2008年10月16日 程序是写出来满足绝大部分人的,而批处理是满足我们自己的。
  20. 2008年10月17日 每个拥有计算机和懂计算机的人都应该学习批处理。
  21. 2008年10月18日 因为世界上任何一个人都能通过简单的学习掌握批处理这门“编程语言”
复制代码

[ 本帖最后由 随风 于 2008-10-18 22:33 编辑 ]
技术问题请到论坛发帖求助!

这个应该难不住 terse 兄,效率问题只要写代码时多费费脑筋就ok了   ^_^

5 万行 一分钟左右 。。。。
这个效率应该可以接受。

这是帮一朋友写代码时想到的,若不讲究效率则此题就不难了。
对批处理的语法要求更高,对入门不久的新手应该是很好的练手题目。。。
技术问题请到论坛发帖求助!

TOP

用 reg ?
没有任何思路。。
只要是系统自带的命令都可以。
期待结果。。。
技术问题请到论坛发帖求助!

TOP

呵呵,对效率的考验。。
各位都出了精彩的代码了。
暂时没时间细看代码,下回去慢慢看。。。
初步做了下测试。


16楼 batman 耗时 0 小时 1 分钟 5 秒 31 毫秒

14楼 rat 耗时 0 小时 0 分钟 57 秒 40 毫秒

12楼 terse 耗时 0 小时 1 分钟 7 秒 75 毫秒

本人目前的代码 耗时: 0 小时 0 分钟 13 秒 72 毫秒
代码在U盘,下次发出来。

其实思路很简单,先获取总行数,并得到N 天前的日期。再逐日递加日期。
技术问题请到论坛发帖求助!

TOP

::递加日期,以处理5万行的文本为例
::本机测试   耗时: 0 小时 0 分钟 14 秒 72 毫秒
::这次测试怎么都要14秒。。郁闷!难道是电脑不同的原因?
代码效率关键是,for 内部运行的命令越少越好。
:
  1. @echo off&setlocal enabledelayedexpansion
  2. set ttime=%time%&set wjm=ab cd.txt
  3. for /f "tokens=2 delims=:" %%a in ('find /v /c "" "%wjm%"') do set /a tian=%%a-1
  4. call :Date2Day "%date:~0,10%" %tian% sy sm sd
  5. echo  %tian% 天前的日期是:%sy%年%sm%月%sd%日
  6. set /a sm+=100,sd+=100,n=100,yue113=131
  7. for %%a in (31 28 31 30 31 30 31 31 30 31 30 31) do set /a n+=1&set /a yue!n!=1%%a
  8. set /a yue102="^!(sy%%4)&^!(^!(sy%%100))|^!(sy%%400)+128",py=yue!sm!
  9. echo.1>nul 3>c.txt
  10. for /f "usebackq delims=" %%a in ("%wjm%") do (
  11.    echo !sy!年!sm:~-2!月!sd:~-2!日 %%a
  12.    set /a sd+=1
  13.    if !sd! gtr !py! (
  14.      set /a sd=101,sm+=1&set /a py=yue!sm!&echo.
  15.      if !sm! gtr 112 (
  16.         set /a sy+=1,sm=101,yue102="^!(sy%%4)&^!(^!(sy%%100))|^!(sy%%400)+128"
  17. )))
  18. echo.1>nul 4>con
  19. call :time0 "%ttime%" "%time%" ok
  20. echo  耗时: %ok%&title ok
  21. echo.&pause
  22. start notepad "c.txt"&exit  
  23. :Date2Day 获取指定天数的日期 (封装)
  24. setlocal&rem by Will Sort @cn-dos
  25. for /f "tokens=1-3 delims=/-, " %%a in ('echo/%~1') do (
  26. set /a yy=%%a,mm=100%%b%%100,dd=100%%c%%100)
  27. set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2
  28. set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633
  29. set /a i=j-%~2,a=i+2472632,b=4*a+3,b/=146097,c=-b*146097,c/=4,c+=a
  30. set /a d=4*c+3,d/=1461,e=-1461*d,e/=4,e+=c,m=5*e+2,m/=153,dd=153*m+2,dd/=5
  31. set /a dd=-dd+e+1,mm=-m/10,mm*=12,mm+=m+3,yy=b*100+d-4800+m/10
  32. endlocal&set %3=%yy%&set %4=%mm%&set %5=%dd%&goto :EOF
  33. :time0  计算批处理运行时间(封装)
  34. setlocal&set /a n=0&rem by 随风 @bbs.bathome.net
  35. for /f "tokens=1-8 delims=.: " %%a in ("%~1:%~2") do (
  36. set /a n+=10%%a%%100*360000+10%%b%%100*6000+10%%c%%100*100+10%%d%%100
  37. set /a n-=10%%e%%100*360000+10%%f%%100*6000+10%%g%%100*100+10%%h%%100)
  38. set /a s=n/360000,n=n%%360000,f=n/6000,n=n%%6000,m=n/100,n=n%%100
  39. set "ok=%s% 小时 %f% 分钟 %m% 秒 %n% 毫秒"
  40. endlocal&set "%~3=%ok:-=%"&goto :eof
复制代码

[ 本帖最后由 随风 于 2008-10-20 17:04 编辑 ]
1

评分人数

    • terse: 精彩PB + 5 技术 + 1
技术问题请到论坛发帖求助!

TOP

看代码真是累,若想完全看懂各位的代码太需要时间了。
略看了一下,发现大家都忽略了一个问题,就是代码中for循环时你们都用了 call  命令
5万行,即使只运行10分之一次,效率也是会被明显拖慢的。
在庞大的数据面前,即使是 set str=!str:~-2! 这样的语句都会对效率有一定影响。
另外:pusofalse 测试真的是7秒吗?
    我测试最好的都是 13 秒,难道真的和电脑有这么大的关系?
    各位测试的结果也贴出来看看好吗/?

[ 本帖最后由 随风 于 2008-10-20 17:58 编辑 ]
技术问题请到论坛发帖求助!

TOP

返回列表