![]() |
Trim dauert bis zu 5 minuten....Benötige schnelle Lösung
Hallo
habe mal wieder ein problem beim laden von einer 5MB text datei sollen leer zeilen entfernt werden. benutze derzeit
Delphi-Quellcode:
oder
for i := Memo1.Lines.Count - 1 downto 0 do
begin if Trim(Memo1.Lines[i]) = '' then Memo1.Lines.Delete(d); Memo1.Lines[i] := Trim(Memo1.Lines[i]); end;
Delphi-Quellcode:
problem ist, es dauert einfach zu lange... es dauert ca. 5 minuten
Sl:=TStringlist.Create;
SL.LoadFromFile(OpenDialog1.Filename); for i := SL.Count - 1 downTo 0 do if SL[i] = '' then begin // ist etwas schneller... es gibt doch bestimmt ein schnellere Möglichkeit |
Re: Trim dauert bis zu 5 minuten....Benötige schnelle Lösung
Versuch es mal damit:
Delphi-Quellcode:
while ( Pos( SL.Text, sLineBreak + sLineBreak ) > 0 ) do
SL.Text := StringReplace( SL.Text, sLineBreak + sLineBreak, sLineBreak, [ rfReplaceAll ] ); |
Re: Trim dauert bis zu 5 minuten....Benötige schnelle Lösung
bei Memo1.lines.Delete wird jedesmal alles was unter der zu löschenden Linie steht eine Linie "nach oben verschoben". Ich denke das benötigt am meisten zeit. ich würde versuchen alle zu löschenden zeilen mir zu merken und dann nurnoch alle nicht-zulöschenden zeilen in ein neues TStringsObjekt zu kopiern.
|
Re: Trim dauert bis zu 5 minuten....Benötige schnelle Lösung
Zitat:
Ganz wichtig: ![]()
Delphi-Quellcode:
oder
Memo1.Lines.BeginUpdate;
try for i := Memo1.Lines.Count - 1 downto 0 do begin Memo1.Lines[i] := Trim(Memo1.Lines[i]); if Memo1.Lines[i] = '' then Memo1.Lines.Delete(i); end; finally Memo1.Lines.EndUpdate; end;
Delphi-Quellcode:
mit der richtigen StringList sollte es aber am Schnellsten sein (innerhalb der TStrings-Ableger)
Memo1.Lines.BeginUpdate;
try for i := Memo1.Lines.Count - 1 downto 0 do begin S := Trim(Memo1.Lines[i]); if S = '' then Memo1.Lines.Delete(i) else Memo1.Lines[i] := S; end; finally Memo1.Lines.EndUpdate; end;
Delphi-Quellcode:
mit StringReplace läßt sich nur ='' und .Delete halbwegs gut realisieren und mit'm Trim wird's schon schwerer/langsamer
SL := TStringList.Create;
try SL.LoadFromFile(OpenDialog1.Filename); for i := SL.Count - 1 downto 0 do begin S := Trim(SL[i]); if S <> '' then SL[i] := S else SL.Delete(i); end; SL.SaveToFile(OpenDialog1.Filename); finally SL.Free; end; |
Re: Trim dauert bis zu 5 minuten....Benötige schnelle Lösung
Ein weiterer Ansatz ist eine zweite temporäre Stringliste:
Delphi-Quellcode:
SL := TStringList.Create;
try tmp := TStringList.Create; try SL.LoadFromFile(OpenDialog1.Filename); for i := 0 to SL.Count - 1 do begin S := Trim(SL[i]); if S <> '' then tmp.Add(S); end; tmp.SaveToFile(OpenDialog1.Filename); finally tmp.Free; end; finally SL.Free; end; |
Re: Trim dauert bis zu 5 minuten....Benötige schnelle Lösung
Ich habe das einfach mal verglichen.
Die Variante mit der temporären TStringList ist die schnellste. Getestet mit einer 11MB großen Datei (MSHTML.pas mehrfach ineinander kopiert bis 11MB herauskamen) Allerdings lagen die Ergebnisse bei allen (die Memo-Variante habe ich mal weggelassen) hier vorgeschlagenen Varianten im Bereich von 3000-5000 Ticks! Somit benötigt mein Rechner für die Verarbeitung der 11MB großen Datei max. 5 Sekunden auch bei der "langsamen" Variante. Die 11MB große Datei wurde zudem noch über das lokale Netzwerk gelesen und wieder geschrieben. Da frage ich mich natürlich, wo du diese Datei herholst und wie schnell bzw. langsam dein Rechner ist. cu Oliver |
Re: Trim dauert bis zu 5 minuten....Benötige schnelle Lösung
Zitat:
Erstmal wird somit die Aktualisierung des Memos unterbunden, was hier schonmal viel Zeit ausmacht. Außerdem ist die StringList des Memos keine "echte" Stringlist. Sie ist eine Weiterleitung an das Memo. - im Memo ist der gesamte Text an einem Stück enthalten - jeder Lesezugriff auf eine Zeile holt diese aus dem Gesamttext raus - jeder Schreibzugriff ersetzt die Zeile im Gesamttext, weswegen beim Löschen und Ersetzen mit unterschiedlicher Länge da jedesmal so Einiges kopiert wird TStringList enthält dagegen die Zeilen als Einzelstrings, weswegen da ein Ändern/Ersetzen wesentlich schneller von Statten geht. |
Re: Trim dauert bis zu 5 minuten....Benötige schnelle Lösung
Darum habe ich das Verarbeiten in/mit einem Memo-Feld aus meiner Betrachtung ja auch rausgelassen.
Ein Memo-Feld ist eine Anzeige-Komponente und hat im Verarbeitungsteil eigentlich nichts zu suchen ;) Aber er hat ja geschrieben, dass er das mit einer Stringlist auch schon versucht hat, und das dauert bei ihm auch sehr lange. |
Re: Trim dauert bis zu 5 minuten....Benötige schnelle Lösung
Hallo
funktioniert soweit ganz gut...nur ist mir aufgefallen das zum schluss immer noch eine leer zeile stehen bleibt.... was die Datei betrifft es ist eine log Datei... |
Re: Trim dauert bis zu 5 minuten....Benötige schnelle Lösung
Zitat:
Alle Zeilen werden mit einem Zeilenumbruch (sLineBreak => #13#10) abgeschlossen. Auch die letzte Zeile mit Text. Dadurch kommt diese Leerzeile. Wenn du dieses tatsächlich nicht haben möchtest, dann schnippel das letzte sLineBreak einfach ab. cu Oliver |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz