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

TOP

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

TOP

我是这样处理的  确定文本行数  然后就是总行数之前的日期   开始累加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

原帖由 batman 于 2008-10-19 19:40 发表
看了这段代码,人都要晕了。。。。我也想过用这种方法,但这样效率肯定是上不去的,因
为这样要进行100000次日期计算,其中还要进行很多次的判断,但另一种平常好用的设置
变量法实践中效率更低(变量数量太大了) ...

其实没有进行100000次日期计算  假设50000行 就是50000次运算啊  其中判断少不了的

TOP

原帖由 随风 于 2008-10-20 15:09 发表
呵呵,对效率的考验。。
各位都出了精彩的代码了。
暂时没时间细看代码,下回去慢慢看。。。
初步做了下测试。


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

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


13秒的处理 真高效
说实话 我想尽办法也没有让代码的效率的提高
我想我的以年递减 在确定日期方面一个也快的了
就是递加和判断方面  我想是少不了一条一条判断的
期待 随风兄的精彩代码

TOP

TOP

返回列表