有两个文本文件文件1:
123456
234567
345678
456789
......文件2:
456789
234567
111111
222222
000000
......要得到:
456789
234567
每个文件有上万行
查找两个文件相同的行不用数据据,请问如何做?
希望有具体代码!
123456
234567
345678
456789
......文件2:
456789
234567
111111
222222
000000
......要得到:
456789
234567
每个文件有上万行
查找两个文件相同的行不用数据据,请问如何做?
希望有具体代码!
j,k:integer;
Sf,Sf1:TStrings;
begin
Sf:=TStringList.Create;
Sf1:=TStringList.Create;Sf.LoadFromFile(Filename);
Sf1.LoadFromFile(Filename1);for j:=0 to Sf1.Count-1 do
begin
for k:=0 to Sf.Count-1 do
begin
if Sf1[j]=Sf[k] then
begin
Memo3.Lines.Add(Sf1[j]);
Break;
end;
end;
end;这是我写的代码,
测试一W条记录时(文件1与文件2分别是1W条与8千条),相同的8000条CPU利用100%
而且时间比较长请问应该如何做?
j:integer;
Sf,Sf1:THashedStringList;
begin
Sf:=THashedStringList.Create;
Sf1:=THashedStringList.Create;Sf.LoadFromFile(Filename);
Sf1.LoadFromFile(Filename1);Sf.Sort;
Sf1.Sort;for j:=0 to Sf1.Count-1 do
begin
if Sf.IndexOf(Sf1[j]) <> -1 then
begin
Memo3.Lines.Add(Sf1[j]);
inc(i);
end;
end;
Sf.Free;
Sf1.Free;还是一样,CPU占用100%,速度慢!
如何解决?
各位老大,出手啦!
先把第一个文件的每一行做HASH后,装入HASH 表,现在,试着对第二个表的每行做HASH,
并试着装入HASH表,如果试图装入表中时,出现冲突,则非常有可能是相同行,这个时候,具体查看这两行的数据,看是否相同就可以了。
我对你题目中的相同行的理解是: “查找两个文件中的相同数据”,也就是说,第一个文件的第一行是否在第二个文件中的某一行出现过。如果第二个文件的第二行和第一个文件的第一行一样,我就认为他们是相同行。不知道对不对。
针对你的具体情况,你可以为你的HASH表提供一个类似于 function ItemExists(): Boolean 方法,因为第二个文件其实不用装入表,这个操作的时间就节约了。
这个不太清楚呢!能不能就TStringList来实现快速度对比呢?如果不行,再考虑用Hash