中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 求一段文件比较批处理 以10Q币答谢.
作者:
标题: 求一段文件比较批处理 以10Q币答谢. 上一主题 | 下一主题
ming6747
新手上路





积分 6
发帖 2
注册 2007-12-20
状态 离线
『楼 主』:  求一段文件比较批处理 以10Q币答谢.

有2个TXT文件 开始2个文件内容一样  后来在一个文件里 无序插入一些字母或数字或别的符号  比如 a.txt 123456 b.txt 1123ab4c56   请把b.txt 多插入的内容找出来  存放到c.txt  比如 a.txt 123456 b.txt 1123ab4c56 c.txt 1abc 大家看下....THANK


2007-12-20 03:19
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
jmz573515
银牌会员




积分 1212
发帖 464
注册 2006-12-13
状态 离线
『第 2 楼』:  

set ws=createobject("wscript.shell")
set fso=createobject("scripting.filesystemobject")
set file1=fso.opentextfile("a.txt")
s=file1.readall
file1.close
n=len(s)
set file2=fso.opentextfile("b.txt")
i=1
do while file2.atendofstream<>true
	b=file2.read(1)
	if b=mid(s,i,1) then
		i=i+1
		if mid(s,i,2)=vbcrlf then sm=sm&vbcrlf
	else
		sm=sm&b
	end if
loop
file2.close
set file=fso.createtextfile("c.txt")
file.write sm
file.close
ws.run "c.txt"


2007-12-20 10:04
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
everest79
金牌会员

一叶枝头,万树皆春



积分 2564
发帖 1127
注册 2006-12-25
状态 离线
『第 3 楼』:  

SETLOCAL ENABLEDELAYEDEXPANSION
set src=123456
set dst=1123ab4c5sgserg6
set/atmp_0=0,tmp_1=0
call :los
for /l %%i in (0,1,%tmp_0%) do (
call :appa !src:~%%i,1! %%dst:~!tmp_1!,1%% %%i
set/a tmp_1+=1
)

echo %str%!dst:~%tmp_1%!
pause
goto :eof


:appa
if "%~1" equ "%~2" goto :eof
set str=%str%%2
set /a tmp_1+=1
call :appa %~1 %%dst:~%tmp_1%,1%% %tmp_1%
goto :eof

:los
if not "!src:~%tmp_0%,1!" == "" set /a tmp_0+=1&&goto los
set/a tmp_0-=1
goto :eof


2007-12-20 10:22
查看资料  发短消息 网志   编辑帖子  回复  引用回复
scriptor
银牌会员




积分 1187
发帖 555
注册 2006-12-21
状态 离线
『第 4 楼』:  

这个bat强~~ 哈哈..... 不知道lz兑现了没有!!!


2007-12-20 18:52
查看资料  发短消息 网志   编辑帖子  回复  引用回复
qzwqzw
银牌会员

天的白色影子


积分 2343
发帖 636
注册 2004-3-6
状态 离线
『第 5 楼』:  

这个问题很有些深入的空间 如果 a=123456 b=123a45c456 那么结果应该是 c=ac45 还是 c=a45c 从算法上前者更简单一些 从效果上后者更实际一些 这也仅是假定了b>a的情形 如果 a=123456 b=12a45b6 那么c值应该是多少 (当然实际上这里需要设置一个用于存放a-b结果的d值) 此时指针的移动就比较复杂了 fc的机制中有一个最大失配范围的设定(假定是m) 即如果a的指针移动了m 仍然未与b匹配 则尝试移动b的指针试图与a匹配 在b移动了m仍然未匹配时 会报达到最大失配值的错误 但是这种算法在应用上仍然是有缺陷的 比如 a=123456 b=123a56456 通常比较的结果是 c=a456 d=4 但是实际上我们更希望获得的结果是 c=a56 d=空 也就是说 我们希望能在最大失配范围内找到最匹配的结果 而非最近的匹配结果 关于这一点 Ultra Comare的二进制智能比较似乎做得更好一些 我曾经使用Beyond Compare和Ultra Compare 比较新旧神雕 虽然经过很多预处理 但结果仍然不是十分理想 主要在于跨行文本结果匹配 因为文本比较是基于行的 假如 a=是的。没问题。 b=是的。<换行>没问题。 则两大软件都会将全部内容做为c、d值 而实际上我更想获得的结果是 c=<换行> 这我在将比较文本的所有换行全部替换为特殊标记后得到了改善 但仍然存在更多的问题 总的来说 简单的比较比较的简单 复杂的比较十分的复杂 [ Last edited by qzwqzw on 2007-12-20 at 07:50 PM ]


2007-12-20 19:38
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 6 楼』:  

我曾经使用Beyond Compare和Ultra Compare 比较新旧神雕
新旧神雕?视频文件还是小说?


2007-12-20 21:06
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
qzwqzw
银牌会员

天的白色影子


积分 2343
发帖 636
注册 2004-3-6
状态 离线
『第 7 楼』:  

这还用问? 我只当没看见 白说了半天的文本比较了~


2007-12-20 21:13
查看资料  发短消息 网志   编辑帖子  回复  引用回复
qzwqzw
银牌会员

天的白色影子


积分 2343
发帖 636
注册 2004-3-6
状态 离线
『第 8 楼』:  

另外 有心人请注意 关于fc的那段最大失配指针移动算法描述得有问题 并非简单得先移b再移a


2007-12-20 21:16
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 9 楼』:  

Originally posted by qzwqzw at 2007-12-20 21:13: 这还用问? 我只当没看见 白说了半天的文本比较了~
呵呵,是我想歪了


2007-12-20 22:14
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
everest79
金牌会员

一叶枝头,万树皆春



积分 2564
发帖 1127
注册 2006-12-25
状态 离线
『第 10 楼』:  

其实这个批处理我原来用的是源与目标的字长都要取得,所以有:los标签,不过楼主声明了是后期插入,所以就不需要了,嘿嘿


2007-12-20 23:30
查看资料  发短消息 网志   编辑帖子  回复  引用回复
ming6747
新手上路





积分 6
发帖 2
注册 2007-12-20
状态 离线
『第 11 楼』:  

很谢谢2楼和3楼给我的答案 希望看到的答案是批处理  而不是VBS脚本语言和高级语言编的...


2007-12-21 19:31
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
knoppix7
银牌会员





积分 1287
发帖 634
注册 2007-5-2
来自 cmd.exe
状态 离线
『第 12 楼』:  

3楼就是BAT啊...


2007-12-21 21:13
查看资料  发短消息 网志   编辑帖子  回复  引用回复
qq43142691
中级用户





积分 327
发帖 152
注册 2007-5-4
状态 离线
『第 13 楼』:  

三楼的。。。好像不完成啊。。 测试 set src=123456 set dst=667 这样就出错了。。不知为啥。。。


2007-12-21 21:52
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
everest79
金牌会员

一叶枝头,万树皆春



积分 2564
发帖 1127
注册 2006-12-25
状态 离线
『第 14 楼』:  

Originally posted by ming6747 at 2007-12-21 07:31 PM: 很谢谢2楼和3楼给我的答案 希望看到的答案是批处理  而不是VBS脚本语言和高级语言编的...
嘿嘿,各位,看到好加点分哇,Q币就免了
SETLOCAL ENABLEDELAYEDEXPANSION
set /p src=<a.txt
set /p dst=<b.txt
set src=123456
set dst=1123ab4c5sgserg6
set/atmp_0=0,tmp_1=0
call :los
for /l %%i in (0,1,%tmp_0%) do (
call :appa !src:~%%i,1! %%dst:~!tmp_1!,1%% %%i
set/a tmp_1+=1
)

echo %str%!dst:~%tmp_1%! >c.txt
pause
goto :eof


:appa
if "%~1" equ "%~2" goto :eof
set str=%str%%2
set /a tmp_1+=1
call :appa %~1 %%dst:~%tmp_1%,1%% %tmp_1%
goto :eof

:los
if not "!src:~%tmp_0%,1!" == "" set /a tmp_0+=1&&goto los
set/a tmp_0-=1
goto :eof
[ Last edited by everest79 on 2007-12-22 at 10:45 AM ]


2007-12-22 10:41
查看资料  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: