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