标题: 批处理比较文档内容检出改变和增加行运行速度能加快吗
[打印本页]
作者: ZJHJ
时间: 2007-1-24 11:15
标题: 批处理比较文档内容检出改变和增加行运行速度能加快吗
我是DOS爱好者,刚学习不久.我的问题是:批处理比较文档内容检出改变和增加行运行速度用什么办法能加快检出时间?
以下是我写的全自动检出源码,对比文件若有上万或上十万行,如果检出改变和增加行有几百或上千行,检出内容花的时间就不能接受了.我认为关键问题出在删除正确行所花的时间太慢(:2iq).敬请高手指教!
@echo off
@title 文档内容对比检出
:cxsr
@echo.
@echo.
@echo 这是文档内容变化对比检出程序
@echo.
@echo 它将自动检出在原始文件上被改动或增加的行内容
@echo.
@echo.
SET /P gwjm= 请将原始文件拉入本窗口:
if exist %gwjm% goto zx
@goto cxsr
:zx
COPY %gwjm% 原始文件.txt
:cx2
SET /P xwj= 请将内容有变化的新文件拉入本窗口:
if exist %xwj% goto zx2
@goto cx2
:zx2
COPY %xwj% 新文件.txt
:: 本程序开始运行时间
set time_begin=%time:~0,-3%
echo 开始操作运行时间: %date% %time_begin%>检出结果.txt
@echo. >>检出结果.txt
for /f "tokens=1,2,3 delims=:" %%i in ("%time_begin%") do (
set /a hour_b=%%i
set /a munite_b=%%j
set /a second_b=%%k
)
:: 检查原始文件行数
find /v /c "" 原始文件.txt >h.txt
:: 将空格替换成=
for /f "delims=" %%d in (h.txt) do (
set "a=%%d"
call set "b=%%a:"=%%"
call set "c=%%b: ==%%"
for /f "delims=" %%h in ('echo "%%c%%"') do echo %%~h >xc.txt
)
del h.txt
:: 检出行数字
FOR /F %%i in (xc.txt) do set y=%%i
echo %y:~21%>yhs.txt
del xc.txt
:: 检查新文件行数
find /v /c "" 新文件.txt >h.txt
:: 将空格替换成=
for /f "delims=" %%d in (h.txt) do (
set "a=%%d"
call set "b=%%a:"=%%"
call set "c=%%b: ==%%"
for /f "delims=" %%h in ('echo "%%c%%"') do echo %%~h >xc.txt
)
del h.txt
:: 检出行数字
FOR /F %%i in (xc.txt) do set x=%%i
echo %x:~20%>xhs.txt
del xc.txt
:: 开始执行文件对比
fc 原始文件.txt 新文件.txt /L >对比结果.txt
@echo.
@echo 开始处理结果,请稍候...
@echo.
echo 原始文件共 %y:~18% 行
del yhs.txt
del xhs.txt
del 原始文件.txt
del 新文件.txt
:: 删除空行
cd.>1.txt
for /f "delims=" %%i in (对比结果.txt) do >>1.txt echo %%i
del 对比结果.txt
:: 空格用特殊字符替换
setlocal ENABLEDELAYEDEXPANSION
FOR /F "delims=" %%i in (1.txt) do (
SET wei=%%i
SET wei=!wei: =◎!
ECHO !wei!>>2.txt
)
:: 在每行前端加特殊字符以便提取
for /f "delims=" %%i in (2.txt) do >>t.txt echo △%%i
del 2.txt
del 1.txt
:: 检查原始文件行数
find /v /c "" t.txt >h.txt
:: 将空格替换成=
for /f "delims=" %%d in (h.txt) do (
set "a=%%d"
call set "b=%%a:"=%%"
call set "c=%%b: ==%%"
for /f "delims=" %%h in ('echo "%%c%%"') do echo %%~h >xc.txt
)
del h.txt
:: 检出行数字
FOR /F %%i in (xc.txt) do set m=%%i
echo %m:~18%>hs.txt
del xc.txt
:iq
@echo off
:: 执行检出分离
:: 自动记数
if not exist js.txt echo 1 >js.txt
setlocal enabledelayedexpansion
for /f %%u in (js.txt) do (
echo 检出相关%m:~18% 行! 现在进行第 %%u 行检查
echo %%u>a.txt
set js=%%u
set /a js+=1
if !js! gtr n次 goto tz
>js.txt echo !js!
)
:: 提取执行次数
FOR /F %%j IN (a.txt) DO SET fsy=%%j
:: 到最后行停止
if "%fsy%"=="%m:~18%" goto 1A
:: 逐行识别
for /f "tokens=1* delims=:" %%i in ('findstr/n . t.txt') do (
if "%fsy%"=="%%i" echo %%j>1.txt
)
:: 识别特殊标记进行分离
FOR /F %%I IN (1.txt) DO SET txt=%%I
if "△*****◎原始文件.txt" == "%txt%" GOTO A
if "△*****◎新文件.TXT" == "%txt%" GOTO B
@goto iq
:A
@cls
if not exist js.txt echo 1 >js.txt
setlocal enabledelayedexpansion
for /f %%u in (js.txt) do (
echo 检出相关 %m:~18% 行! 现在进行第 %%u 行检查
echo %%u>a.txt
set js=%%u
set /a js+=1
if !js! gtr n次 goto tz
>js.txt echo !js!
)
FOR /F %%j IN (a.txt) DO SET fsy=%%j
if "%fsy%"=="%m:~18%" goto 1A
for /f "tokens=1* delims=:" %%i in ('findstr/n . t.txt') do (
if "%fsy%"=="%%i" echo %%j>1.txt
)
FOR /F %%I IN (1.txt) DO SET txt=%%I
if "△*****◎新文件.TXT" == "%txt%" GOTO B
:: 将原有文件内容写入
echo %txt% >>原有.txt
@goto A
:B
@cls
if not exist js.txt echo 1 >js.txt
setlocal enabledelayedexpansion
for /f %%u in (js.txt) do (
echo 检出相关 %m:~18% 行! 现在进行第 %%u 行检查
echo %%u>a.txt
set js=%%u
set /a js+=1
if !js! gtr n次 goto tz
>js.txt echo !js!
)
FOR /F %%j IN (a.txt) DO SET fsy=%%j
if "%fsy%"=="%m:~18%" goto 1A
for /f "tokens=1* delims=:" %%i in ('findstr/n . t.txt') do (
if "%fsy%"=="%%i" echo %%j>1.txt
)
FOR /F %%I IN (1.txt) DO SET txt=%%I
if "△*****◎原始文件.txt" == "%txt%" GOTO A
:: 将新有文件内容写入
echo %txt% >>新有.txt
@goto B
:1A
echo. & pause
:: 开始处理结果
echo △***** >原.txt
more +1 原有.txt>>原.txt
del 原有.txt
ren 原.txt 原有.txt
del 1.txt
del a.txt
del hs.txt
del js.txt
del t.txt
:: 检查原有.txt行数
find /v /c "" 原有.txt>h.txt
:: 将空格替换成=
for /f "delims=" %%d in (h.txt) do (
set "a=%%d"
call set "b=%%a:"=%%"
call set "c=%%b: ==%%"
for /f "delims=" %%h in ('echo "%%c%%"') do echo %%~h >xc.txt
)
del h.txt
:: 检出行数字
FOR /F %%i in (xc.txt) do set v=%%i
echo %v:~19%>hs.txt
del xc.txt
:2iq
@echo off
@echo.
@echo 程序正在运行,请稍候...
@echo.
@echo 删除原始识别 %v:~19% 行
@echo.
@echo --- --- --- --- --- --- ---
@echo.
:: 检查运行次数
if not exist js.txt echo 1 >js.txt
setlocal enabledelayedexpansion
for /f %%u in (js.txt) do (
echo 现在删除第 %%u 行
echo %%u>a.txt
set js=%%u
set /a js+=1
if !js! gtr n次 goto tz
>js.txt echo !js!
)
:: 提取执行次数
FOR /F %%j IN (a.txt) DO SET wfsy=%%j
:: 到原始文件最后行停止
if "%wfsy%"=="%v:~19%" goto 2A
:: 逐行提取样本
for /f "tokens=1* delims=:" %%i in ('findstr/n . 原有.txt') do (
if "%wfsy%"=="%%i" echo %%j>x.txt
)
:: 将样本设置为变量
FOR /F %%I IN (x.txt) DO SET wfsy1=%%I
:: 替换删除相同行
For /f "delims=" %%d in (新有.txt) do (
set "a=%%d"
call set "b=%%a:"=%%"
call set "c=%%b:%wfsy1%=╳%%"
for /f "delims=" %%h in ('echo "%%c%%"') do echo %%~h >>tmp.txt
)
DEL 新有.txt
:: 去掉已删除行(为了减少对比时间)
find "△" tmp.txt >> 5.txt
ren 5.txt 新有.txt
DEL tmp.txt
goto 2iq
:2A
:: 提取“△”行
find "△" 新有.txt >>yy.txt
:: 去除◎字符
for /f "delims=" %%d in (yy.txt) do (
set "a=%%d"
call set "b=%%a:"=%%"
call set "c=%%b:◎= %%"
for /f "delims=" %%h in ('echo "%%c%%"') do echo %%~h >>du.txt
)
del 原有.txt
del 新有.txt
:: 去除“△”字符,恢复文件原貌
for /f "delims=" %%d in (du.txt) do (
set "a=%%d"
call set "b=%%a:"=%%"
call set "c=%%b:△= %%"
for /f "delims=" %%h in ('echo "%%c%%"') do echo %%~h >>检出结果.txt
)
:: 检查检出行数
find /v /c "" 检出结果.txt >h.txt
:: 将空格替换成=
for /f "delims=" %%d in (h.txt) do (
set "a=%%d"
call set "b=%%a:"=%%"
call set "c=%%b: ==%%"
for /f "delims=" %%h in ('echo "%%c%%"') do echo %%~h >xc.txt
)
del h.txt
:: 检出行数字
FOR /F %%i in (xc.txt) do set g=%%i
echo %g:~21%>ghs.txt
set /a jc=%g:~21%-3
del xc.txt
@echo. >>检出结果.txt
@echo. ---------------------- >>检出结果.txt
@echo. >>检出结果.txt
@echo.
@echo 以上检出的是与原始文件不同的所在行或增加的内容,请进行核实! >>检出结果.txt
@echo. >>检出结果.txt
@echo 原始文件共 %y:~21% 行! 被检新文件共 %x:~20% 行!>>检出结果.txt
@echo. >>检出结果.txt
@echo 检出相关 %m:~18% 行! 删除原始识别 %v:~19% 行! 检出结果 %jc% 行!>>检出结果.txt
del yy.txt
del du.txt
del x.txt
del js.txt
del hs.txt
del a.txt
del ghs.txt
set time_end=%time:~0,-3%
for /f "tokens=1,2,3 delims=:" %%i in ("%time_end%") do (
set /a hour_e=%%i
set /a munite_e=%%j
set /a second_e=%%k
)
if %second_e% lss %second_b% (
set /a munite_e=%munite_e%-1
set /a second_e=%second_e%+60
)
set /a second_=%second_e%-%second_b%
if %munite_e% lss %munite_b% (
set /a hour_e=%hour_e%-1
set /a munite_e=%munite_e%+60
)
set /a munite_=%munite_e%-%munite_b%
if %hour_e% lss %hour_b% (
set /a hour_e=%hour_e%+24
)
set /a hour_=%hour_e%-%hour_b%
@echo. >>检出结果.txt
echo 操作结束时间: %date% %time_end%>>检出结果.txt
@echo. >>检出结果.txt
echo 共运行了 %hour_% 小时 %munite_% 分 %second_% 秒 >>检出结果.txt
@echo.
@echo 文档检查已运行结束!
@echo.
type 检出结果.txt
@echo.
pause
作者: ZJHJ
时间: 2007-1-27 11:27
本程序实质上是将“原始文件.txt”和 “新文件.txt”进行对比。生成的结果在“对比结果.txt”中,但是,其中有变更修改和增加行,也有他的上下正确行,和相应正确行,换句话说,就是几乎每有一行变更修改和增加行,就几乎有5行正确行在其中。如果变更修改和增加行有几百上千行在“对比结果.txt”中找是不是有点不爽?本程序的宗旨是只输出变更修改和增加行,(只输出原始文件没有的)。所以进行了对比----分离----删除正确行。在分离后的“新有.txt”文件中,虽然有变更修改和增加行,但也还有2/3的上下正确行。为了只输出原始文件没有的,必须将2/3的上下正确行删除。所以必须进行逐行核实删除,而核实的基准是由分离后的“原有.txt”文件中逐行提供的。也就是说提供的基准如果在“新有.txt”文件中有就执行替换删除。如果“原有.txt”文件中有几百上千行,在“新有.txt”文件中也有几百上千行或更多,而以下程序虽然是自动执行
:2iq
@echo off
@echo.
@echo 程序正在运行,请稍候...
@echo.
@echo 删除原始识别 %v:~19% 行
@echo.
@echo --- --- --- --- --- --- ---
@echo.
:: 检查运行次数
if not exist js.txt echo 1 >js.txt
setlocal enabledelayedexpansion
for /f %%u in (js.txt) do (
echo 现在删除第 %%u 行
echo %%u>a.txt
set js=%%u
set /a js+=1
if !js! gtr n次 goto tz
>js.txt echo !js!
)
:: 提取执行次数
FOR /F %%j IN (a.txt) DO SET wfsy=%%j
:: 到原始文件最后行停止
if "%wfsy%"=="%v:~19%" goto 2A
:: 逐行提取样本
for /f "tokens=1* delims=:" %%i in ('findstr/n . 原有.txt') do (
if "%wfsy%"=="%%i" echo %%j>x.txt
)
:: 将样本设置为变量
FOR /F %%I IN (x.txt) DO SET wfsy1=%%I
:: 替换删除相同行
For /f "delims=" %%d in (新有.txt) do (
set "a=%%d"
call set "b=%%a:"=%%"
call set "c=%%b:%wfsy1%=╳%%"
for /f "delims=" %%h in ('echo "%%c%%"') do echo %%~h >>tmp.txt
)
DEL 新有.txt
:: 去掉已删除行(为了减少对比时间)
find "△" tmp.txt >> 5.txt
ren 5.txt 新有.txt
DEL tmp.txt
goto 2iq
也采取了加快时间的方法,但是,检出花费的时间也会是以小时为单位而不是以分秒为单位了。这就是我想解决的问题,请行家帮助解决!小弟先谢谢了!