中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-08-07 00:37
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 求一段文件比较批处理 以10Q币答谢. 查看 979 回复 13
楼 主 求一段文件比较批处理 以10Q币答谢. 发表于 2007-12-20 03:19 ·  中国 浙江 杭州 萧山区 电信
新手上路
积分 6
发帖 2
注册 2007-12-20 02:58
18年会员
UID 106191
性别 男
状态 离线
有2个TXT文件 开始2个文件内容一样
 后来在一个文件里 无序插入一些字母或数字或别的符号
 比如 a.txt 123456
b.txt 1123ab4c56
  请把b.txt 多插入的内容找出来  存放到c.txt


 比如 a.txt 123456
b.txt 1123ab4c56
c.txt 1abc

大家看下....THANK
2 发表于 2007-12-20 10:04 ·  中国 辽宁 本溪 联通
银牌会员
★★★
积分 1,212
发帖 464
注册 2006-12-13 21:11
19年会员
UID 73417
性别 男
状态 离线

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"
3 发表于 2007-12-20 10:22 ·  中国 广东 广州 天河区 电信
金牌会员
★★★★
一叶枝头,万树皆春
积分 2,564
发帖 1,127
注册 2006-12-25 22:57
19年会员
UID 74552
性别 男
状态 离线

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

4 发表于 2007-12-20 18:52 ·  中国 湖北 武汉 中国科学院武汉分院
银牌会员
★★★
积分 1,187
发帖 555
注册 2006-12-21 07:35
19年会员
UID 74129
性别 男
状态 离线
这个bat强~~ 哈哈.....
不知道lz兑现了没有!!!
5 发表于 2007-12-20 19:38 ·  中国 山西 运城 联通
银牌会员
★★★
天的白色影子
积分 2,343
发帖 636
注册 2004-03-06 00:00
22年会员
UID 19350
性别 男
状态 离线
这个问题很有些深入的空间

如果
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 ]
6 发表于 2007-12-20 21:06 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
20年会员
UID 59080
状态 离线
我曾经使用Beyond Compare和Ultra Compare 比较新旧神雕

新旧神雕?视频文件还是小说?
7 发表于 2007-12-20 21:13 ·  中国 山西 运城 联通
银牌会员
★★★
天的白色影子
积分 2,343
发帖 636
注册 2004-03-06 00:00
22年会员
UID 19350
性别 男
状态 离线
这还用问?
我只当没看见
白说了半天的文本比较了~
8 发表于 2007-12-20 21:16 ·  中国 山西 运城 联通
银牌会员
★★★
天的白色影子
积分 2,343
发帖 636
注册 2004-03-06 00:00
22年会员
UID 19350
性别 男
状态 离线
另外
有心人请注意
关于fc的那段最大失配指针移动算法描述得有问题
并非简单得先移b再移a
9 发表于 2007-12-20 22:14 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
20年会员
UID 59080
状态 离线
Originally posted by qzwqzw at 2007-12-20 21:13:
这还用问?
我只当没看见
白说了半天的文本比较了~

呵呵,是我想歪了
10 发表于 2007-12-20 23:30 ·  中国 广东 广州 电信
金牌会员
★★★★
一叶枝头,万树皆春
积分 2,564
发帖 1,127
注册 2006-12-25 22:57
19年会员
UID 74552
性别 男
状态 离线
其实这个批处理我原来用的是源与目标的字长都要取得,所以有:los标签,不过楼主声明了是后期插入,所以就不需要了,嘿嘿
11 发表于 2007-12-21 19:31 ·  中国 浙江 杭州 萧山区 电信
新手上路
积分 6
发帖 2
注册 2007-12-20 02:58
18年会员
UID 106191
性别 男
状态 离线
很谢谢2楼和3楼给我的答案
希望看到的答案是批处理  而不是VBS脚本语言和高级语言编的...
12 发表于 2007-12-21 21:13 ·  中国 北京 联通
银牌会员
★★★
积分 1,287
发帖 634
注册 2007-05-02 15:06
19年会员
UID 87277
性别 男
来自 cmd.exe
状态 离线
3楼就是BAT啊...
13 发表于 2007-12-21 21:52 ·  中国 广东 东莞 电信
中级用户
★★
积分 326
发帖 152
注册 2007-05-04 06:16
19年会员
UID 87412
性别 男
状态 离线
三楼的。。。好像不完成啊。。
测试
set src=123456
set dst=667
这样就出错了。。不知为啥。。。
14 发表于 2007-12-22 10:41 ·  中国 广东 广州 电信
金牌会员
★★★★
一叶枝头,万树皆春
积分 2,564
发帖 1,127
注册 2006-12-25 22:57
19年会员
UID 74552
性别 男
状态 离线
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 ]
论坛跳转: