[英]Delphi - Check each line of a file againt another file
我必須對照另一個文件檢查文件的每一行。 如果第二個文件中存在第一個文件中的一行,則必須刪除它。 現在,我正在使用2個列表框,並且“向下執行listbox1.items.count-1 ...”我的程序可以運行,但是我必須檢查它是否包含超過100萬行的大文件。 有沒有一種更快的方法呢? 我想將文件加載到內存中以使其變得非常快! 謝謝
您可以為此使用TStringList。 第二個文件的列表應排序以加快搜索速度。 嘗試這個:
var
l1, l2: TStringList;
i: integer;
begin
l1 := nil;
l2 := nil;
try
l1 := TStringList.Create;
l1.loadfromFile('file1');
l2 := TStringList.Create;
l2.LoadFromFile('file2');
l2.Sorted := True;
for i := l1.Count -1 downto 0 do
begin
if l2.IndexOf(l1[i]) <> -1 then
l1.Delete(i);
end;
l1.SaveToFile('file1');
finally
FreeEndNil(l1);
FreeEndNil(l2);
end
end
一種快速的解決方案(但不是最快的解決方案)是使用兩個TStringList列表而不是列表框。
var
a, b: TStringList;
i: Integer;
begin
a := TStringList.Create;
b := TStringList.Create;
try
a.LoadFromFile('C:\1.txt');
b.LoadFromFile('C:\2.txt');
b.Sorted := True;
for i := a.Count - 1 downto 0 do
begin
// Check if line of file 'a' are present in file 'b'
// and delete line if true
if b.IndexOf(a[i]) > -1 then
a.Delete(i);
end;
a.SaveToFile('C:\1.txt');
finally
b.Free;
a.Free;
end;
end;
同樣,這是一個緩慢而簡單的解決方案,可將整個文件加載到RAM中。 它仍然比使用ListBox快得多。 有時候簡單就足以解決一個一次性的問題。
一種更快的方法是在硬盤上創建兩個文件的索引(例如,二進制樹),然后使用該索引進行比較。 這樣,您將不需要將整個文件存儲在磁盤上。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.