终于将效率问题解决了,但代码确实难读了。。。
说明一下:先计算出文本的总行数,然后用渐近法计算出第一个日期(先算年再算月和日)
,然后再用for在按行读取数据时进行日期的累加和输出到新文本。 | @echo off&setlocal enabledelayedexpansion | | set "t=%time%"&echo.>c.txt | | | | set /a year=%date:~,4%,month=1%date:~5,2%%%100,day=1%date:~8,2%%%100 | | | | for %%i in (31 29 31 30 31 30 31 31 30 31 30 31) do ( | | set /a num+=1&set "_!num!=%%i" | | set "code1=!code1! %%i"&set "code2=!code2! !num!#%%i" | | ) | | | | for /f "usebackq delims=" %%i in ("ab cd.txt") do set /a n+=1 | | | | set /a n=n-day | | for %%a in (%code1%) do ( | | if "!m!" neq "%month%" ( | | set /a n-=%%a,m+=1 | | ) else ( | | goto lp1 | | ) | | ) | | :lp1 | | | | set /a year-=1,n-=365 | | set /a a=year%%4,b=year%%100,c=year%%400,yun=28,_2=28 | | if %b% equ 0 ( | | if %c% equ 0 set /a n-=1,yun+=1,_2+=1 | | ) else ( | | if %a% equ 0 set /a n-=1,yun+=1,_2+=1 | | ) | | if %n% geq 0 goto lp1 | | set "code1=!code1:29=%yun%!"&set "code2=!code2:29=%yun%!" | | | | for %%a in (%code2%) do ( | | for /f "tokens=1,2 delims=#" %%i in ("%%a") do ( | | set /a n+=%%j | | if !n! geq 0 set /a month=%%i-1,day=%%j-n&goto next | | ) | | ) | | :next | | | | for /f "usebackq delims=" %%i in ("ab cd.txt") do ( | | set /a n=day-_!month! | | if !n! gtr 0 call :lp2 | | if !month! geq 10 ( | | if !day! geq 10 ( | | echo !year!年!month!月!day!日 %%i>>c.txt | | ) else ( | | echo !year!年!month!月0!day!日 %%i>>c.txt | | ) | | ) else ( | | if !day! geq 10 ( | | echo !year!年0!month!月!day!日 %%i>>c.txt | | ) else ( | | echo !year!年0!month!月0!day!日 %%i>>c.txt | | ) | | ) | | set /a day+=1 | | ) | | echo 开始时间:%t% | | echo 结束时间:%time% | | pause>nul&goto :eof | | :lp2 | | | | echo.>>c.txt | | set /a month+=1,day=1 | | if %month% equ 13 ( | | set /a year+=1,month=1,a=year%%4,b=year%%100,c=year%%400,_2=28 | | if !b! equ 0 ( | | if !c! equ 0 set "_2=29" | | ) else ( | | if !a! equ 0 set "_2=29" | | ) | | )COPY |
[ 本帖最后由 batman 于 2008-10-20 03:40 编辑 ] |