终于将效率问题解决了,但代码确实难读了。。。
说明一下:先计算出文本的总行数,然后用渐近法计算出第一个日期(先算年再算月和日)
,然后再用for在按行读取数据时进行日期的累加和输出到新文本。- @echo off&setlocal enabledelayedexpansion
- set "t=%time%"&echo.>c.txt
- rem 提出当前的年月日数值
- set /a year=%date:~,4%,month=1%date:~5,2%%%100,day=1%date:~8,2%%%100
- rem 设置变量
- 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"
- )
- rem 获取文本总行数
- for /f "usebackq delims=" %%i in ("ab cd.txt") do set /a n+=1
- rem 计算并减去本年已过的天数
- set /a n=n-day
- for %%a in (%code1%) do (
- if "!m!" neq "%month%" (
- set /a n-=%%a,m+=1
- ) else (
- goto lp1
- )
- )
- :lp1
- rem 计算初始年份
- 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%!"
- rem 计算初始月份和日期
- 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
- rem 核心代码部分,读取文本内容并递加日期,输出到新文本
- 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
- rem 子程序:跨月、跨年的计算和判断
- 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"
- )
- )
复制代码
[ 本帖最后由 batman 于 2008-10-20 03:40 编辑 ] |