![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-03 05:35 |
共 48,038 主题排行 / 350,123 发帖 / 今日 1 篇 / 48,251 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » 批处理比较文档内容检出改变和增加行运行速度能加快吗 |
| 可打印版本 915 / 1 |
| 第1楼 ZJHJ | 发表于 2007-01-24 11:15 |
| 高级用户 发帖 374 积分 609 | |
|
批处理比较文档内容检出改变和增加行运行速度能加快吗 我是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 |
|
| 第2楼 ZJHJ | 发表于 2007-01-27 11:27 |
| 高级用户 发帖 374 积分 609 | |
|
本程序实质上是将“原始文件.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 也采取了加快时间的方法,但是,检出花费的时间也会是以小时为单位而不是以分秒为单位了。这就是我想解决的问题,请行家帮助解决!小弟先谢谢了! |
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |