You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在比较两个文本文件时忽略每行前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

火山引擎 最新活动