Delphi - 再检查另一个文件的每一行文件

时间:2016-01-05 17:04:12

标签: delphi

我必须检查文件的每一行与另一个文件。 如果第一个文件中的一行存在于第二个文件中,我必须将其删除。 现在我正在使用2个列表框,“for listbox1.items.count-1 downto确实开始......” 我的程序有效但我必须检查这个超过1百万行的巨大文件。 这种方法有更快的方法吗? 我想加载内存中的文件,以便非常快! 感谢

2 个答案:

答案 0 :(得分:1)

您可以使用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

答案 1 :(得分:1)

快速解决方案(但不是最快的解决方案)是使用两个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快得多。有时简单就足以解决一次性问题。

更快的方法是在硬盘上创建两个文件的索引(例如二叉树)并使用此索引进行比较。这样您就不需要将整个文件存储在磁盘上了。