[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
我是这样处理的  确定文本行数  然后就是总行数之前的日期   开始累加1  直到文本结束
似乎效率不理想
代码简化一下  但效率没上去
本想以年为递减  结果有差错  改回
  1. @echo off
  2. echo 开始时间 %time%
  3. for /f "tokens=1-3 delims=-/\:. " %%i in ("%date%") do set /a p1=%%i,p2=100%%j%%100,p3=100%%k%%100
  4. set/a PN2="!(p1%%4) & !(!(p1%%100)) | !(p1%%400)",PN2+=28
  5. for /f "tokens=%p2%" %%i in ("31 !pN2! 31 30 31 30 31 31 30 31 30 31") do set pt=%%i
  6. for /f "delims=" %%i in ('type "abcd.txt"^|find /v /c ""') do set /a tt=%%i
  7.     cd.>b.txt
  8.     setlocal enabledelayedexpansion
  9.     for /f "usebackq delims=" %%i in ("abcd.txt") do (
  10.     if not defined b set b=p&call :lp
  11.     if !p3! gtr !pt! set/a p3-=pt,p2+=1&call:next
  12.     if !p2! lss 10 (set m2=0!p2!)else set m2=!p2!
  13.     if !p3! lss 10 (set d3=0!p3!)else set d3=!p3!
  14.     >>b.txt echo !p1!年!m2!月!d3!日 %%i
  15.     if !p3! equ !pt! >>b.txt echo.
  16.     set/a p3+=1
  17. )
  18.     echo 结束时间 %time%
  19.     pause&exit /b
  20. :next
  21.     if !p2! gtr 12 set/a PN2="^!(p1%%4) & ^!(^!(p1%%100)) | ^!(p1%%400)",PN2+=28,p1+=1,p2=p2%%12
  22.     for /f "tokens=%p2%" %%i in ("31 !pN2! 31 30 31 30 31 31 30 31 30 31") do set pt=%%i
  23.     goto :eof
  24. :lp
  25.     set/a p2-=1
  26.     if %p2% equ 0 set/a PN2="^!(p1%%4) & ^!(^!(p1%%100)) | ^!(p1%%400)",PN2=28+PN2,p1-=1,p2=12
  27.     for /f "tokens=%p2%" %%i in ("31 %pN2% 31 30 31 30 31 31 30 31 30 31") do set/a p3+=%%i&set pt=%%i
  28.     if %p3% leq %tt% goto lp
  29.     set/a p3-=tt
  30.     goto :eof
复制代码


再修正一下  以年递减 不满一年 以月递减
修正一个 在行数小的情况出现的BUG
  1. @echo off
  2. echo 开始时间 %time%
  3. for /f "tokens=1-3 delims=-/\:. " %%i in ("%date%") do set /a p1=%%i,p2=100%%j%%100,p3=100%%k%%100
  4.     set/a pn="!(p1%%4) & !(!(p1%%100)) | !(p1%%400)",pn+=28,pn2=pn+31
  5.     for /f "tokens=%p2%" %%i in ("31 %pn% 31 30 31 30 31 31 30 31 30 31") do set pt=%%i
  6.     for /f "tokens=%p2%" %%i in ("0 31 %pn2% 90 120 151 181 212 243 273 304 334") do set/a p3+=%%i
  7.     for /f "delims=" %%i in ('type "ab cd.txt"^|find /v /c ""') do set /a tt=%%i-1
  8.     if %tt% gtr %p3% (set/a tt-=p3,p1-=1,p2=12,p3=31)else goto lp2
  9. :lp
  10.     set/a pn="!(p1%%4) & !(!(p1%%100)) | !(p1%%400)",pn+=365
  11.     if %tt% gtr %pn% set/a tt-=pn,p1-=1&goto lp
  12.     set/a pn="!(p1%%4) & !(!(p1%%100)) | !(p1%%400)",pn+=28
  13. :lp1
  14.     if %p3% gtr %tt% goto lp2
  15.     set/a p2-=1
  16.     for /f "tokens=%p2%" %%i in ("31 %pn% 31 30 31 30 31 31 30 31 30 31") do set/a p3+=%%i&set pt=%%i
  17.     if %p3% leq %tt% goto lp1
  18. :lp2
  19.     set/a p3-=tt
  20.     cd.>b.txt
  21.     setlocal enabledelayedexpansion
  22.     for /f "usebackq delims=" %%i in ("ab cd.txt") do (
  23.     if !p3! gtr !pt! set/a p3-=pt,p2+=1&call:next
  24.     if !p2! lss 10 (set m2=0!p2!)else set m2=!p2!
  25.     if !p3! lss 10 (set d3=0!p3!)else set d3=!p3!
  26.     >>b.txt echo !p1!年!m2!月!d3!日 %%i
  27.     if !p3! equ !pt! >>b.txt echo.
  28.     set/a p3+=1
  29. )
  30.     echo 结束时间 %time%
  31.     pause&exit /b
  32. :next
  33.     if !p2! gtr 12 set/a pn="^!(p1%%4) & ^!(^!(p1%%100)) | ^!(p1%%400)",pn+=28,p1+=1,p2=p2%%12
  34.     for /f "tokens=%p2%" %%i in ("31 !pn! 31 30 31 30 31 31 30 31 30 31") do set pt=%%i
  35.     goto :eof
复制代码

[ 本帖最后由 terse 于 2008-10-20 13:48 编辑 ]

TOP

日期反过来输出不是做不到,只是一时只想到设置变量的办法,但设置50000个变量就根本谈不上效率了。。。不知随风兄有何妙法?
***共同提高***

TOP

抛砖了!!!

仅做到日期从当前开始输出:
测试文本生成代码:
  1. @echo off&for /l %%i in (1,1,50000) do echo %%i>>"ab cd.txt"
复制代码
解题代码:
  1. @echo off&setlocal enabledelayedexpansion
  2. set "t=%time%"&echo.>c.txt
  3. set /a year=%date:~,4%,month=1%date:~5,2%%%100,day=1%date:~8,2%%%100,yun=29
  4. for /f "usebackq delims=" %%i in ("ab cd.txt") do (
  5.     echo !year!-!month!-!day! %%i>>c.txt
  6.     set /a day-=1
  7.     if !day! equ 0 (
  8.        echo.>>c.txt
  9.        set /a month-=1
  10.        if !month! equ 0 (
  11.           set /a year-=1,month=12,day=31&call :lp1
  12.           ) else (
  13.           call :lp2
  14.        )
  15.     )
  16. )
  17. echo 程序开始时间为:%t%
  18. echo 程序结束时间为:%time%
  19. pause>nul&goto :eof
  20. :lp1
  21. set /a a=year%%4,b=year%%100,c=year%%400,yun=28
  22. if %b% equ 0 (
  23.    if %c% equ 0 set "yun=29"
  24.    ) else (
  25.    if %a% equ 0 set "yun=29"
  26. )
  27. goto :eof     
  28. :lp2
  29. for /f "tokens=%month%" %%a in ("1#31 2#%yun% 3#31 4#30 5#31 6#30 7#31 8#31 9#30 10#31 11#30 12#31") do (
  30.     for /f "tokens=2 delims=#" %%i in ("%%a") do set "day=%%i"
  31. )
复制代码
经pusofalse版主提醒修改部分代码后再测试(本人机子慢了),测试时间如下:
***共同提高***

TOP

哈哈,小楼兄摆明的是在出难题啊,经测算日期计算只能用32秒左右的时间,确实是个挑战。。。

[ 本帖最后由 batman 于 2008-10-19 09:21 编辑 ]
***共同提高***

TOP

批处理对日期的处理实在麻烦,来个vbs先
  1. Set fso = CreateObject("Scripting.FileSystemObject")
  2. set f = fso.OpenTextFile("ab cd.txt")
  3. f.ReadAll : lines = f.Line : f.Close
  4. set f = fso.OpenTextFile("ab cd.txt")
  5. Do While f.AtEndOfStream <> True
  6.     s =s & GetDate(f.Line) & " " & f.ReadLIne & vbCrLf
  7. Loop
  8. fso.OpenTextFile("c.txt",2,True).Write s
  9. Function GetDate(nDiff)
  10.     nDate = DateAdd("d", nDiff-lines, date)
  11.     if month(nDate) <> month(nDate-1) then strMonChange = vbCrLf
  12. GetDate = strMonChange & _
  13.         year(nDate) & "年" & _
  14.         right("0" & month(ndate), 2) & "月" & _
  15.         right("0" & day(ndate), 2) & "日"
  16. End Function
复制代码
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

1867年计算到2008 整4分
重新整理下再看

TOP

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

TOP

纯P是不是不让调外部命令?
可以用reg.exe么?

TOP

这题主要麻烦在日期处理,其他没什么。关于日期处理cn-dos有很多现成的代码。我也不想再去找了。

以前在cn-dos收集的代码,修理硬盘备份在同学的电脑上,后来被他删了。扁死他也找不回来了。也没有时间和那份心情再去重新收集
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

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

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

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

TOP

可以做到 但效率不理想

TOP

返回列表