請問如何比對2個text file中有那些不同 |
尚未結案
|
mingshine
一般會員 ![]() ![]() 發表:3 回覆:3 積分:1 註冊:2002-11-04 發送簡訊給我 |
|
hagar
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
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 發送簡訊給我 |
誰是新的?誰是舊的?要分一下唷!不然我怎麼知道我的比對結果,差異是以誰的為準? 這里假設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 發送簡訊給我 |
|
mingshine
一般會員 ![]() ![]() 發表:3 回覆:3 積分:1 註冊:2002-11-04 發送簡訊給我 |
|
syntax
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
引言: 我剛測了一下二個完全相同的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 倍 理論上差這麼多,所以一次讀多一點是比較好的 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |