{leerzeilen löschen}
Delphi-Quellcode:
Stringliste.loadfromfile('Testdatei');
..
for i:=Stringliste.count-1 downto 0 do
if length(Stringliste[i])=0 then Stringliste.delete(i);
Hat man mehr als 1 Mio Zeilen, kann das schon dauern. Darum meine Frage, wie kann ich das optimieren?
Ein etwas besseres Laufzeitverhalten habe ich mit
Delphi-Quellcode:
for i:=Stringliste.count-1 downto 0 do begin
if length(Stringliste[i])>0 then stringlist2.insert(0,stringlist[i]);
Stringlist.delete(i);
end;
(das Verhältnis ist etwa 6:5)
Als untauglich hat sich erwiesen:
Delphi-Quellcode:
p:=pos(#13#10#13#10,string);
while p>0 do begin
delete(string,p,2);
p:=posex(#13#10#13#10,string,p-1);
end
Da beim TStringlist.Delete letztlich nur 3 Pointer verschoben werden erhoffe ich mir von einer Pointerliste auch keine große Verbesserung.
All zuviel kann man da eh nicht optimieren.
1. es wird ein Pointer aus der Liste entfernt UND die Pointer der nachfolgenden Strings werden verschoben
2. die Referenzen der zukopierenden Strings werden kopiert, und die Referenzzählung wird angesprochen (Stringinhalte werden nicht kopiert)
3. erst wird aus allen Strings/Zeilen EIN großer String gebastelt, dann wird via StringReplace "jeder" doppelte Zeilenumbruch einzeln entfernt (Achtung, bei 3 und mehr aufeinanderfolgenden Zeilenumbrüchen wird nur jeder Zweite entfernt), dabei werden alle nachfolgenden Zeichen jedesmal umkopiert, und dann wird der ganze String wieder in viele Einzelstrings zerlegt
Auslesen als TEXT geht nur bei einem Memo (TMemoStrings) schneller, da dort der Text zusammenhängend im
RAM liegt. (aber das Löschen der Leerzeilen sollte auch da temporärn einer TStringList erfolgen, da das TMemo arschlangsam ist).
Wie kommen die Daten denn in die TStringList?
Was am Schnellsten ginge, wäre die Leerstrings garnicht erst aufzunehmen.
Also die Add-Methode überschreiben und bei dem ungewollten Leerstring abbrechen.