吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1453|回复: 20
收起左侧

[其他原创] 关于两个纯文本文件对比【憋出来的智慧】

[复制链接]
冥界3大法王 发表于 2024-10-28 13:46
本帖最后由 冥界3大法王 于 2024-10-28 17:55 编辑

有以下两个纯文本文件:
内容如下:


一个叫: Win7x64开发x64dbg.vmx
假设1 = 不能没有你
.encoding = "GBK"
displayName = "Win7x64开发x64dbg"
config.version = "8"
virtualHW.version = "18"
mks.enable3d = "TRUE"
pciBridge0.present = "TRUE"
pciBridge4.present = "TRUE"
pciBridge4.virtualDev = "pcieRootPort"
pciBridge4.functions = "8"
pciBridge5.present = "TRUE"
pciBridge5.virtualDev = "pcieRootPort"


一个叫:过VMWare检测.vmx
假设1 = 我们来了
cpuid.1.eax = "00000000000000110000011011100100"
假设2 = 你好你好
cpuid.1.ecx = "0--------------0----------------"
cpuid.1.edx = "-----------0---------0----------"



要求是这个样子的:【对比   过VMWare检测.vmx】的 键(=前面的内容) 与  【 Win7x64开发x64dbg.vmx的键 (=前面的内容)  是否相同】
若是相同,就用 过VMWare检测.vmx 的 值  替换   Win7x64开发x64dbg.vm 的值
绿色部分呢,写入到   Win7x64开发x64dbg.vmx 的文件中。。。

折腾3天才算自己折腾明白,惭愧啊。






开始的思路是这样的,先弄一个按行读取文件的循环,得到行内容 ,再分割 得 到  键 与 值
下面再套一个循环 ,分别对比。。。

后来发现写的代码有问题,要么是有重的,要么是该加的没加进来。。。

后来第二天想了一个办法。。。第二重循环中 我去调用 过程,这样就能避免菜鸟遇到双循环问题
测试后发现代码越界了。。

方案又搁浅了。。 不想论坛光麻烦别人啊。。。

后来昨天晚上床上认真的又思考了一下:
最终代码如下:
[Delphi] 纯文本查看 复制代码
procedure TForm14.再向虎山行2Click(Sender: TObject);
var
  过List: TStringList;
  过I: integer;
  过检List: TStringlist;
  match: TMatch;
  Reader: TStreamReader;
  过检档案: string;
  替换后的内容1, 替换后的内容2: string;
begin
  Memo1.Clear;
  过List := TStringList.Create;
  过List.LoadFromFile('过VMWare检测.vmx');
  过检List := TStringList.Create;
  for 过I := 0 to 过List.Count - 1 do        //用传统的按行读取过虚拟机文件
  begin
//     ShowMessage(过List.Strings[过I]);     //这里是得到的行内容!
    过检List.Delimiter := '=';
    过检List.StrictDelimiter := True;
    过检List.DelimitedText := 过List[过I];
//    ShowMessage(过检List[0]);             //这里是得到的 过检的【键】(值是不需要的)

    Reader := TStreamReader.Create('Win7x64开发x64dbg.vmx', TEncoding.ANSI);
    过检档案 := Reader.ReadToEnd();
    match := TRegEx.match(过检档案, 过检List[0] + '.*');     //用这里的键作为正则表达式(与 待修改文件 整体 进行正则 匹配)
    if (match.Success) then                //如果匹配到 过虚拟机检测文件的 那行
    begin
      ShowMessage(match.Value);
      Memo1.Text := TRegEx.Replace(过检档案, 过检List[0] + '.*', 过List.Strings[过I]);   //替换 待改文件的 那行
      替换后的内容1 := TRegEx.Replace(过检档案, 过检List[0] + '.*', 过List.Strings[过I]);

      TFile.ReadAllText('Win7x64开发x64dbg.vmx', TEncoding.ANSI);
      TFile.WriteAllText('Win7x64开发x64dbg1.vmx', 替换后的内容1, TEncoding.ANSI);      //改个名保存 覆盖替换 待改文件,不然文件提示被占用
    end
    else                                                                                //未匹配成功的键(的那行)
    begin
      Memo1.Lines.Add(过List.Strings[过I]);
//用过检测文件的其他行(也就是没匹配的那行)写入到待改文件的末尾(Append)追加的方式
      替换后的内容2 := #13#10 + 过List.Strings[过I];       //前面加上换行,不然起始行就堆叠一起了。

      TFile.ReadAllText('Win7x64开发x64dbg1.vmx', TEncoding.ANSI);
      TFile.AppendAllText('Win7x64开发x64dbg1.vmx', 替换后的内容2, TEncoding.ANSI); //第二次保存用追加的方式 ,不然就被覆盖了。
    end;
  end;
end;




免费评分

参与人数 2吾爱币 +7 热心值 +2 收起 理由
poptop + 1 用心讨论,共获提升!
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 冥界3大法王 发表于 2024-10-28 13:51
下面再分别给出错误 的代码供大家学习,千万别学我。

procedure TForm14.Button2Click(Sender: TObject);
var
  被修改的VMX文件: TStringList;
  a1: Integer;
  list1, list2: TStringlist;
  档案: string;
  Reader: TStreamReader;
  match: TMatch;
begin
  Memo1.Clear;
  被修改的VMX文件 := TStringList.Create;
  被修改的VMX文件.LoadFromFile('Win7x64开发x64dbg.vmx', TEncoding.ANSI);
  list1 := TStringlist.Create;
  for a1 := 0 to 被修改的VMX文件.Count - 1 do
  begin
//    ShowMessage(被修改的VMX文件[a1]); //这样就得到了被修改的行内容
    list1.Delimiter := '=';           //设置分隔符为等号
    list1.StrictDelimiter := True;    //确保分隔符前后没有其他字符
    list1.DelimitedText := 被修改的VMX文件[a1];
  //  ShowMessage('键:' + list1[0] + #13#10 + '值:' + list1[1]);     //此处分割出了待修改行的  键  与 值!
//    ShowMessage('键:' + list1[0]);

    Reader := TStreamReader.Create('过VMWare检测.vmx', TEncoding.ANSI);
    档案 := Reader.ReadToEnd();
    match := TRegEx.match(档案, '^' + list1[0] + '=.*');

    if (match.Success) then
    begin
//      ShowMessage('匹配到' + match.Value + #13#10 + '再写入相关的值' + list1[1]);
//      Memo1.Lines.Add(list1[0]);
      Memo1.Lines.Add(match.Value);

    end
    else
    begin
//      ShowMessage('未匹配到写当前行!' + #13#10 + 被修改的VMX文件[a1]);
      Memo1.Lines.Add(被修改的VMX文件[a1]);
    end;
  end;

end;

==================================
procedure TForm14.方案二Click(Sender: TObject);
var
  被修改的VMX文件: TStringList;
  被修改Y: Integer;
  被修改list: TStringlist;
  档案: string;
  过虚拟机检测的list: TStringList;
  过虚检X: integer;
begin
  Memo1.Clear;
  被修改的VMX文件 := TStringList.Create;
  过虚拟机检测的list := TStringList.Create;
  被修改的VMX文件.LoadFromFile('Win7x64开发x64dbg.vmx', TEncoding.ANSI);
  过虚拟机检测的list.LoadFromFile('过VMWare检测.vmx', TEncoding.ANSI);
  被修改list := TStringlist.Create;
  for 被修改Y := 0 to 被修改的VMX文件.Count - 1 do
  begin
    ShowMessage(被修改的VMX文件[被修改Y]); //这样就得到了被修改的行内容
    被修改list.Delimiter := '=';           //设置分隔符为等号
    被修改list.StrictDelimiter := True;    //确保分隔符前后没有其他字符
    被修改list.DelimitedText := 被修改的VMX文件[被修改Y];
  //  ShowMessage('键:' + list1[0] + #13#10 + '值:' + list1[1]);     //此处分割出了待修改行的  键  与 值!
//    ShowMessage('键:' + list1[0]);


    for 过虚检X := 0 to 过虚拟机检测的list.Count - 1 do
    begin
     // ShowMessage('被修改的文件行内容是:' + 被修改的VMX文件[a1] + #13#10 + '过虚拟机检测的行内容是:' + 过虚拟机检测的list.Strings[b1]);

      if Pos(被修改list[0], 过虚拟机检测的list.Strings[过虚检X]) > 0 then     //如果被读取的那个 被修改的 第一行的 键 被 过检测的行 所包含
      begin
        Memo1.Lines.Add(过虚拟机检测的list.Strings[过虚检X]);
      end;

      if Pos(被修改list[0], 过虚拟机检测的list.Strings[过虚检X]) = 0 then     //第二种可能【过虚拟机检测的那行不包含   list1[0]】
      begin
        Memo1.Lines.Add(过虚拟机检测的list.Strings[过虚检X]);

      end;
         // Memo1.Lines.Add(被修改的VMX文件[a1]);
    end;

  end;
end;
===================================
procedure TForm14.方案三Click(Sender: TObject);
var
  被修改的VMX文件: TStringList;
  被修改Y: Integer;
  被修改list: TStringlist;
  档案: string;
  过虚拟机检测的list: TStringList;
  过虚检X: integer;
begin
  //(1)先把不包含的行写入
  Memo1.Clear;
  被修改的VMX文件 := TStringList.Create;
  过虚拟机检测的list := TStringList.Create;
  被修改的VMX文件.LoadFromFile('Win7x64开发x64dbg.vmx', TEncoding.ANSI);
  过虚拟机检测的list.LoadFromFile('过VMWare检测.vmx', TEncoding.ANSI);
  被修改list := TStringlist.Create;
  for 被修改Y := 0 to 被修改的VMX文件.Count - 1 do
  begin
   // ShowMessage(被修改的VMX文件[被修改Y]); //这样就得到了被修改的行内容
    被修改list.Delimiter := '=';           //设置分隔符为等号
    被修改list.StrictDelimiter := True;    //确保分隔符前后没有其他字符
    被修改list.DelimitedText := 被修改的VMX文件[被修改Y];
   // ShowMessage('键:' + 被修改list[0]);

    for 过虚检X := 0 to 过虚拟机检测的list.Count - 1 do
    begin
    //  ShowMessage(过虚拟机检测的list[过虚检X]);
      过虚拟机检测的list.Delimiter := '=';
      过虚拟机检测的list.StrictDelimiter := True;
      过虚拟机检测的list.DelimitedText := 被修改的VMX文件[被修改Y];
     // ShowMessage('键:' + 过虚拟机检测的list[0]);


      if pos(过虚拟机检测的list[0], 被修改list[0]) = 0 then          // 越界啊!!!
      begin
       // Memo1.Lines.Add(过虚拟机检测的list.Strings[过虚检X]);
      end
      else
      begin
        Memo1.Lines.Add(过虚拟机检测的list.Strings[过虚检X]);
      end;
    end;
    //(2)再把“键”不一样的行写八!
  end;
end;

====================================
procedure 读取第N行(const FileName: string; 行: integer);
var
  List: TStringList;
begin
  List := TStringList.Create;
  try
    List.LoadFromFile(FileName);
    if List.Count >= 行 then      //检查文件是否X行
    begin
//输出第X行内容
    ShowMessage('第X行内容是:' + List[行]); //索引从0开始,所以第二行索引是1
      临时行内容 := List[行];
    end
    else
    begin
      exit;
//      ShowMessage('文件没有第X行!');
    end;
  finally
    List.Free;
  end;
end;

procedure TForm14.老款读行2Click(Sender: TObject);
begin
  读取第N行('Win7x64开发x64dbg.vmx', StrToInt(Edit1.Text));
end;

======================================
procedure TForm14.再向虎山行1Click(Sender: TObject);
var
  被修改的VMX文件: TStringList;
  被修改Y: Integer;
  被修改list: TStringlist;
  档案: string;
  过虚拟机检测的list: TStringList;
  过虚检X: integer;
  N: integer;
begin
  //(1)先把不包含的行写入
  N := 0;
  Memo1.Clear;
  被修改的VMX文件 := TStringList.Create;
  过虚拟机检测的list := TStringList.Create;
  被修改的VMX文件.LoadFromFile('Win7x64开发x64dbg.vmx', TEncoding.ANSI);
  过虚拟机检测的list.LoadFromFile('过VMWare检测.vmx', TEncoding.ANSI);
  被修改list := TStringlist.Create;
  for 被修改Y := 0 to 被修改的VMX文件.Count - 1 do
  begin
   // ShowMessage(被修改的VMX文件[被修改Y]); //这样就得到了被修改的行内容
    被修改list.Delimiter := '=';           //设置分隔符为等号
    被修改list.StrictDelimiter := True;    //确保分隔符前后没有其他字符
    被修改list.DelimitedText := 被修改的VMX文件[被修改Y];
  //ShowMessage('键:' + 被修改list[0]);

    读取第N行('过VMWare检测.vmx', N);
    过虚拟机检测的list.Delimiter := '=';
    过虚拟机检测的list.StrictDelimiter := True;
    过虚拟机检测的list.DelimitedText := 临时行内容;
    //ShowMessage('键:' + 过虚拟机检测的list[0]);

//过虚拟机检测的list[0], 被修改list[0]
    if pos(过虚拟机检测的list[0], 被修改的VMX文件[被修改Y]) = 0 then
    begin
      Memo1.Lines.Add(临时行内容);
    end;
    Inc(N);

//(2)再把“键”不一样的行写入!
//    if Pos(过虚拟机检测的list[0], 被修改list[0]) = 0 then    //如果键名相同
//    begin
//      Memo1.Lines.Add(被修改的VMX文件[被修改Y]);             //用右边行写入
//    end
//    else
//    begin
//      Memo1.Lines.Add(临时行内容);                          //用左边行写入
//    end;

  end;
end;
wawawa 发表于 2024-10-28 14:28
很专业很好,值得学习。(一脸懵走了,再见)
yjg95 发表于 2024-10-28 15:06
crazy965 发表于 2024-10-28 17:26
这种脚本非常适合用chatgpt,描述清楚需求,chatgpt可以完成的很好。
当然楼主主动思考的过程一样非常重要。
zzzzzyihang 发表于 2024-10-28 18:27
可是我看不懂         
13878205185 发表于 2024-10-28 19:30

感谢大神分享,学习学习
感谢大神分享,学习学习
thinkfish 发表于 2024-10-28 20:55
你这大炮,竟然跑去打蚊子   
woflant 发表于 2024-10-29 00:11
帮顶

不过,法王的帖子还是一如既往的晦涩难懂
jrjmusic 发表于 2024-10-29 01:31
何止是晦涩难懂,实在是……看不懂。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 17:56

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表