Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi-将一个文件的每一行与另一个文件对照检查_Delphi - Fatal编程技术网

Delphi-将一个文件的每一行与另一个文件对照检查

Delphi-将一个文件的每一行与另一个文件对照检查,delphi,Delphi,我必须对照另一个文件检查文件的每一行。 如果第一个文件中的一行存在于第二个文件中,我必须将其删除。 现在我使用2个列表框和“for listbox1.items.count-1 down to do begin…” 我的程序可以运行,但我必须检查这个文件是否有超过100万行的大文件。 这种方法有没有更快的方法? 我想加载内存中的文件,以便非常快! 谢谢您可以使用TStringList来完成此操作。应该对第二个文件的列表进行排序,以便更快地搜索。试试这个: var l1, l2: TStrin

我必须对照另一个文件检查文件的每一行。 如果第一个文件中的一行存在于第二个文件中,我必须将其删除。 现在我使用2个列表框和“for listbox1.items.count-1 down to do begin…” 我的程序可以运行,但我必须检查这个文件是否有超过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
var
l1,l2:t英语;
i:整数;
开始
l1:=零;
l2:=零;
尝试
l1:=TStringList.Create;
l1.loadfromFile('file1');
l2:=TStringList.Create;
l2.LoadFromFile('file2');
l2.排序:=真;
对于i:=l1。计数-1到0
开始
如果l2.IndexOf(l1[i])-1,那么
l1.删除(i);
结束;
l1.保存文件(“文件1”);
最后
FreeEndNil(l1);
FreeEndNil(l2);
结束
结束
一个快速解决方案(但不是最快的)是使用两个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中加载整个文件的缓慢而简单的解决方案。它仍然比使用列表框快得多。有时候简单就足以解决一次性问题


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

有没有更快的方法?是的。可能的副本与我之前回答的相同;)只需将要修改的文件读取到stringlist中,即可节省大量内存。您可以逐行打开和读取的另一个文件。请查看
TStreamReader
及其
ReadLine()
方法。这两个答案之间的相似性确实非常显著。此答案缺少“var i:integer;”。在这种情况下,我投票支持下面的解决方案,这是完整的解决方案!这种方法会为非常大的文件占用大量内存。是的,我知道,但我认为这将是最快的解决方案。内存也不是今天计算机的问题。你不需要开始时的两行(这两个变量为零),也不需要使用FreeAndNil来释放它们(它们是局部变量,在块的末尾会超出范围)。这在内存和CPU方面会非常昂贵。排序之后是二进制搜索成本。@user2858981将其与现实生活进行比较:什么更快?简单比较两个列表与在一块板上画两个列表,然后比较两者?