Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Trim dauert bis zu 5 minuten....Benötige schnelle Lösung (https://www.delphipraxis.net/142617-trim-dauert-bis-zu-5-minuten-benoetige-schnelle-loesung.html)

Landogar-Garuno 31. Okt 2009 00:54


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:
    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;
oder

Delphi-Quellcode:
 Sl:=TStringlist.Create;
  SL.LoadFromFile(OpenDialog1.Filename);
   for i := SL.Count - 1 downTo 0 do
   if SL[i] = '' then
   begin
 //  ist etwas schneller...
problem ist, es dauert einfach zu lange... es dauert ca. 5 minuten

es gibt doch bestimmt ein schnellere Möglichkeit

Sir Rufo 31. Okt 2009 01:28

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 ] );

blablab 31. Okt 2009 03:04

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.

himitsu 31. Okt 2009 03:56

Re: Trim dauert bis zu 5 minuten....Benötige schnelle Lösung
 
Zitat:

Code:
Memo1.Lines.Delete([color=#ff0000]d[/color]);

was ist bitte D?

Ganz wichtig: Delphi-Referenz durchsuchenBeginUpdate

Delphi-Quellcode:
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;
oder
Delphi-Quellcode:
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;
mit der richtigen StringList sollte es aber am Schnellsten sein (innerhalb der TStrings-Ableger)
Delphi-Quellcode:
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;
mit StringReplace läßt sich nur ='' und .Delete halbwegs gut realisieren und mit'm Trim wird's schon schwerer/langsamer

Uwe Raabe 31. Okt 2009 08:44

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;

Sir Rufo 31. Okt 2009 11:35

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

himitsu 31. Okt 2009 11:47

Re: Trim dauert bis zu 5 minuten....Benötige schnelle Lösung
 
Zitat:

Zitat von Sir Rufo
Da frage ich mich natürlich, wo du diese Datei herholst und wie schnell bzw. langsam dein Rechner ist.

Darum der Hinweis auf BeginUpdate.

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.

Sir Rufo 31. Okt 2009 11:53

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.

Landogar-Garuno 3. Nov 2009 01:50

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...

Sir Rufo 3. Nov 2009 08:37

Re: Trim dauert bis zu 5 minuten....Benötige schnelle Lösung
 
Zitat:

Zitat von Landogar-Garuno
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...

öh, die letzte "Leerzeile" ist aber eigentlich keine, bzw. ist "Part of Concept".
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 11:37 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz