線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1285
推到 Plurk!
推到 Facebook!

請問如何比對2個text file中有那些不同

尚未結案
mingshine
一般會員


發表:3
回覆:3
積分:1
註冊:2002-11-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-15 17:22:13 IP:61.218.xxx.xxx 未訂閱
例如 A File B File 1111 1234 2222 2222 3333 3333 4444 4444 我如何比對這兩個檔案的不同之處,並將不同之處寫至另一個File 感謝各位大大!!!
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-10-15 18:15:47 IP:202.39.xxx.xxx 未訂閱
var
  sl1, sl2, slSave: TStringList;
  i: integer;
begin
  sl1 := TStringList.Create;
  sl2 := TStringList.Create;
  slSave := TStringList.Create;
  try
    sl1.LoadFromFile('c:\txt1.txt');
    sl2.LoadFromFile('c:\txt2.txt');
    if sl1.Count > sl2.Count then begin
      for i := 0 to sl2.Count -1 do begin
        if sl1.Strings[i] <> sl2.Strings[i] then
          slSave.Add(sl1.Strings[i]   #9   sl2.Strings[i]);
      end;
      for i := sl2.Count to sl1.Count -1 do
        slSave.Add(sl1.Strings[i]   #9   ' ');
    end;
    if sl2.Count > sl1.Count then begin
      for i := 0 to sl1.Count -1 do begin
        if sl1.Strings[i] <> sl2.Strings[i] then
          slSave.Add(sl1.Strings[i]   #9   sl2.Strings[i]);
      end;
      for i := sl1.Count to sl2.Count -1 do
        slSave.Add(sl1.Strings[i]   #9   ' ');
    end;
    if sl1.Count = sl2.Count then begin
      for i := 0 to sl1.Count -1 do begin
        if sl1.Strings[i] <> sl2.Strings[i] then
          slSave.Add(sl1.Strings[i]   #9   sl2.Strings[i]);
      end;
    end;
    slSave.SaveToFile('C:\result.txt');
  finally
    slSave.Free;
    sl2.Free;
    sl1.Free;
  end;
end;
--- 歡迎光臨 KTop 研究院
japhenchen
高階會員


發表:51
回覆:444
積分:184
註冊:2003-07-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-10-15 18:21:09 IP:211.96.xxx.xxx 未訂閱
誰是新的?誰是舊的?要分一下唷!不然我怎麼知道我的比對結果,差異是以誰的為準?    這里假設b是新的,那麼 用二個tfilestream幫二個檔案全打開吧(底下的例子不檢查檔案不存在的錯誤) 然後如果檔案不大的話,一個字一個字比對,比對結果寫到tlist里去,再savetofile就好    
procedure TForm1.FormCreate(Sender: TObject);
var file1,file2: TFileStream;
    c1,c2: array[0..0] of char ;
    resultlist: TStringList;
begin
   try
      file1:=TFileStream.create('c:\b.txt',fmOpenRead or fmShareExclusive);
      file2:=TFileStream.create('c:\a.txt',fmOpenRead or fmShareExclusive);
      resultlist:=TStringList.Create;
   finally          while file1.Read(c1,1)=1 do
         if file2.Read(c2,1)=1 then begin
            if c1[0]<>c2[0] then
               resultlist.Add(inttostr(file1.Position) ' ' c1[0]);
         end
         else
            resultlist.Add(inttostr(file1.Position) ' ' c1[0]);
      showmessage(resultlist.Text);
      resultlist.savetofile('compared.log');
      freeandnil(file1);
      freeandnil(file2);
   end;
end;
檔案如果很大的話,可以用但最好不要這樣用了,因為很慢~~~~~~~~~~~~~~~~ 大小如果超過1mb,檢查完至少要花幾十秒,像幾百MB的檔案可要半小時以上哩~ 對付大檔案,我會用一次比對一個4K到64K的BLOCK (看情況啦,檔案小點的用4K,大的用64K),二個檔案各讀一個BLOCK,再用CHECKSUM比對二個BLOCK是不是相同(蠻冒險的,#01#02#03的CHECKSUM等於#03#02#01耶),如果不同就再做細部比對....這樣會比較省時間~不過~~ 剛剛有講了一個冒險的問題,我遇過這樣的CASE,請教各位前輩~~是否有解? 我不懂,不懂,不懂....所以我才來ktop學工夫
japhenchen
高階會員


發表:51
回覆:444
積分:184
註冊:2003-07-23

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-10-15 18:38:22 IP:211.96.xxx.xxx 未訂閱
我剛測了一下二個完全相同的AVI檔,223MB,用BYTE BY BYTE的方法,用了十五分鐘才比完.................哇咧OOXX~真慢,用64K BLOCK的方法來比,七秒~ 我不懂,不懂,不懂....所以我才來ktop學工夫
mingshine
一般會員


發表:3
回覆:3
積分:1
註冊:2002-11-04

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-10-16 09:42:52 IP:61.218.xxx.xxx 未訂閱
感謝各位大大的熱心幫忙,小弟收穫不少,謝謝板主
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-10-16 17:59:34 IP:203.222.xxx.xxx 未訂閱
引言: 我剛測了一下二個完全相同的AVI檔,223MB,用BYTE BY BYTE的方法,用了十五分鐘才比完.................哇咧OOXX~真慢,用64K BLOCK的方法來比,七秒~
可以算得出來阿 如讀一次硬碟要 a 秒 兩個 4096 kb 的 bye to byte 比較,就要花費 4096 x 1024 x a x 2 秒在讀取上 而 64 kb block只要 64 x a x 2 秒來讀取 在讀取上就快了 64 x 1024 倍 理論上差這麼多,所以一次讀多一點是比較好的
系統時間:2024-09-04 10:41:01
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!