中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 批处理比较文档内容检出改变和增加行运行速度能加快吗
作者:
标题: 批处理比较文档内容检出改变和增加行运行速度能加快吗 上一主题 | 下一主题
ZJHJ
高级用户





积分 609
发帖 374
注册 2006-8-2
状态 离线
『楼 主』:  批处理比较文档内容检出改变和增加行运行速度能加快吗

我是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

2007-1-24 11:15
查看资料  发短消息 网志   编辑帖子  回复  引用回复
ZJHJ
高级用户





积分 609
发帖 374
注册 2006-8-2
状态 离线
『第 2 楼』:  

本程序实质上是将“原始文件.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

也采取了加快时间的方法,但是,检出花费的时间也会是以小时为单位而不是以分秒为单位了。这就是我想解决的问题,请行家帮助解决!小弟先谢谢了!

2007-1-27 11:27
查看资料  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: