AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Trim dauert bis zu 5 minuten....Benötige schnelle Lösung
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von Landogar-Garuno · begonnen am 31. Okt 2009 · letzter Beitrag vom 3. Nov 2009
Antwort Antwort
Seite 1 von 2  1 2      
Landogar-Garuno

Registriert seit: 22. Feb 2008
36 Beiträge
 
#1

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

  Alt 31. Okt 2009, 01:54
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
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

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

  Alt 31. Okt 2009, 02:28
Versuch es mal damit:
Delphi-Quellcode:
while ( Pos( SL.Text, sLineBreak + sLineBreak ) > 0 ) do
SL.Text := StringReplace( SL.Text, sLineBreak + sLineBreak, sLineBreak, [ rfReplaceAll ] );
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
blablab

Registriert seit: 3. Jan 2006
509 Beiträge
 
Delphi 7 Enterprise
 
#3

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

  Alt 31. Okt 2009, 04:04
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#4

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

  Alt 31. Okt 2009, 04:56
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.442 Beiträge
 
Delphi 12 Athens
 
#5

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

  Alt 31. Okt 2009, 09:44
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;
Uwe Raabe
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

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

  Alt 31. Okt 2009, 12:35
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#7

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

  Alt 31. Okt 2009, 12:47
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

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

  Alt 31. Okt 2009, 12:53
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Landogar-Garuno

Registriert seit: 22. Feb 2008
36 Beiträge
 
#9

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

  Alt 3. Nov 2009, 02:50
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...
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

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

  Alt 3. Nov 2009, 09:37
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:02 Uhr.
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