我必须检查文件的每一行与另一个文件。 如果第一个文件中的一行存在于第二个文件中,我必须将其删除。 现在我正在使用2个列表框,“for listbox1.items.count-1 downto确实开始......” 我的程序有效但我必须检查这个超过1百万行的巨大文件。 这种方法有更快的方法吗? 我想加载内存中的文件,以便非常快! 感谢
答案 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快得多。有时简单就足以解决一次性问题。
更快的方法是在硬盘上创建两个文件的索引(例如二叉树)并使用此索引进行比较。这样您就不需要将整个文件存储在磁盘上了。