如何在比较两个文本文件时忽略每行前5个字符并输出不匹配行
如何在比较两个文本文件时忽略每行前5个字符并输出不匹配行
我完全懂你的需求——就是要对比两个文件,每行只看第6个字符及以后的内容,把那些这部分不一样的行找出来存到错误文件里对吧?
首先得说下你原来用的findstr /vio File1.txt File2.txt为啥不行:这个命令是找两个文件里"独有"的行,它是拿整行来对比的,哪怕前5个字符不一样、后面全相同,它都会把这两行当成不匹配的行,这显然不是你要的效果。你之前试的/r [6-20]也不对,findstr的正则是匹配行内的字符模式,没法直接指定"从第6位开始匹配"的规则。
那怎么实现呢?咱们可以用批处理的字符串截取功能,把每行前5个字符切掉,只对比剩下的部分。给你写个能用的脚本:
@echo off setlocal enabledelayedexpansion echo Start %date% %time% :: 先清空错误文件,避免残留旧内容 echo. > Berror.txt set "lineCount=0" :: 逐行读取File1.txt的内容 for /f "delims=" %%a in (File1.txt) do ( set /a lineCount+=1 :: 读取File2.txt对应行数的内容 for /f "skip=!lineCount!-1 delims=" %%b in (File2.txt) do ( :: 截取每行第6个字符及以后的部分(批处理字符串索引从0开始,~5就是跳过前5个) set "content1=%%a" set "content1=!content1:~5!" set "content2=%%b" set "content2=!content2:~5!" :: 对比截取后的内容,如果不一样就写入错误文件 if not "!content1!"=="!content2!" ( echo 第!lineCount!行不匹配:>> Berror.txt echo File1: %%a >> Berror.txt echo File2: %%b >> Berror.txt echo. >> Berror.txt ) goto nextLine :: 跳出内层循环,处理下一行 ) :nextLine ) echo End %date% %time% :: 打开错误文件查看结果 start notepad Berror.txt pause endlocal
这个脚本的逻辑很清晰:
- 启用
enabledelayedexpansion是为了在循环里正常使用变量 - 用嵌套的for循环分别读取两个文件的对应行
- 用
!var:~5!把每行前5个字符截掉,只保留后面的核心内容 - 对比这部分内容,如果不一样,就把原行和行号写入错误文件
用你提供的测试文件运行这个脚本,Berror.txt里就只会输出第7行的两个不匹配项,完全符合你的预期~
备注:内容来源于stack exchange,提问作者Nicole




