簡體   English   中英

Delphi-再次檢查文件的每一行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM