有两个文本文件文件1:
123456
234567
345678
456789
......文件2:
456789
234567
111111
222222
000000
......要得到:
456789
234567
每个文件有上万行
查找两个文件相同的行不用数据据,请问如何做?
希望有具体代码!

解决方案 »

  1.   

    var
      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%
    而且时间比较长请问应该如何做?
      

  2.   

    var
      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%,速度慢!
    如何解决?
    各位老大,出手啦!
      

  3.   

    用HASH TABLE可以快点,大概意思说一下,具体HASH表的使用和建立你找点资料。
    先把第一个文件的每一行做HASH后,装入HASH 表,现在,试着对第二个表的每行做HASH,
    并试着装入HASH表,如果试图装入表中时,出现冲突,则非常有可能是相同行,这个时候,具体查看这两行的数据,看是否相同就可以了。
    我对你题目中的相同行的理解是: “查找两个文件中的相同数据”,也就是说,第一个文件的第一行是否在第二个文件中的某一行出现过。如果第二个文件的第二行和第一个文件的第一行一样,我就认为他们是相同行。不知道对不对。
    针对你的具体情况,你可以为你的HASH表提供一个类似于 function ItemExists(): Boolean 方法,因为第二个文件其实不用装入表,这个操作的时间就节约了。
      

  4.   

    另外,针对你的情况,你还可以使内存消耗小些,对行做HASH后,只需要将行号保存进HASH表就行了,可以让 HASH表占用少点内存,一万行数据,用2万的HASH表,效果就可以很不错了,冲突时相同行的几率99%没问题。
      

  5.   

    Hash?
    这个不太清楚呢!能不能就TStringList来实现快速度对比呢?如果不行,再考虑用Hash