Einzelnen Beitrag anzeigen

Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#11

Re: 80 MB Datei - doppelte Zeilen entfernen

  Alt 17. Jan 2007, 13:49
Zitat von capo:
Delphi-Quellcode:
  while not(eof(fd1)) do
    begin
      readln(fd1,S);
      if (trim(S)<>'') and (S <> LAST) then
        writeln(fd2,S);
      Last := S;
    end;
Hier solltest Du schonmal unterscheiden, ob S leer war oder nicht (sonst suchst Du auch nur nach einer Leerzeile nur noch nach einer weiteren Leerzeile).

Delphi-Quellcode:
  while not(eof(fd1)) do
    begin
      readln(fd1,S);
      if (trim(S)<>'') and (S <> LAST) then
      begin
        writeln(fd2,S);
        Last := S;
      end;
    end;
So, damit hast Du dann die Variante, die alle aufeinander folgenden, gleichen Zeilen löscht.

Möchtest Du allgemeiner jede Zeile nur einmal haben, dann versuche es lieber mit:
Delphi-Quellcode:
var listAlt, listNeu: TStringList;
    i: Integer;
begin
  listAlt := TStringList.Create;
  // laden wie gehabt
  listAlt.LoadFromFile('...');
 
  listNeu := THashedStringList.Create;
  for i := 0 to listAlt.Count - 1 do
  begin
    if listNeu.indexOf(listAlt[i]) < 0 then
    begin
      listNeu.add(listAlt[i]);
    end;
  end;

  listNeu.SaveToFile('...');
end;
Wie Du hier siehst, wird der Hash nur für die neue Liste verwendet, die alte sollte möglichst keinen haben, da Du hier eh alle Zeilen betrachten wirst. Das Berechnen eines Hashs bringt dir also keinen Vorteil, kostet aber Zeit. Wird nun nach dem Index eines Strings gesucht, so kann dies mit einem Hash sehr viel schneller durchgeführt werden als ohne, für die neue Liste lohnt sich also dieser Hash. Alternativ gibt es noch mind. zwei Möglichkeiten, Du kannst die HashedStringList auch durch eine Map (Alzaimar hat mal eine für Strings als Schlüssel zur Verfügung gestellt) ersetzen (die ist vielleicht noch schneller). Oder aber du setzt bei der neuen StringList die Eigenschaft sorted auf True und die Eigenschaft Duplicates auf dupIgnore. Was davon die höchste Perfomance erzielt kann ich so nicht sagen, musst Du einfach mal testen.

Gruß Der Unwissende
  Mit Zitat antworten Zitat