Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   StringReplace in TStringList (https://www.delphipraxis.net/153103-stringreplace-tstringlist.html)

youuu 21. Jul 2010 09:42

StringReplace in TStringList
 
Hi, habe eine weitere Frage bezüglich Performance von einer TStringlist.

Und zwar verwende ich momentan

Code:
sl.Text := StringReplace(sl.Text,'stringOld','stringNew',[rfReplaceAll]);
zum ersetzen in einer TStringlist, allerdings dauert dies ebenfalls extrem lange, bei 50.000 und weit mehr Einträgen.
Gäbe es einen schnelleren Weg?

z.B vor dem eintragen in der TStringlist, diesen Wert mit verändern, oder einen besseren algorithmus?

Gausi 21. Jul 2010 10:09

AW: StringReplace in TStringList
 
Ich würde in einer Schleife das StringReplace auf jedem Eintrag in der Stringliste machen. Das dürfte wesentlich schneller gehen. :)

himitsu 21. Jul 2010 10:10

AW: StringReplace in TStringList
 
Zitat:

Zitat von youuu (Beitrag 1036538)
Gäbe es einen schnelleren Weg?

Alle Items/Zeilen einzeln verarbeiten?
Denn schau mal nach, was .Text intern so alles macht.

Aber bei .Lines von z.B. einem Memo ist es anderesrum, da dort der Text zusammenhängend verwaltet wird und der Zugriff auf Einzelstrings daher länger dauert.
Aber in TStringList liegt jeder String einzeln im Speicher und daher muß .Text alles zu einem Gesamtstring zusammensetzen und dann wieder zerlegen.

Delphi-Quellcode:
procedure StringReplace(SL: TStrings; OldPattern, NewPattern: string;
  Flags: TReplaceFlags); overload;
var
  i: Integer;
begin
  if (SL.ClassName = 'TMemoStrings') or (Pos(SL.LineBreak, OldPattern) > 0)
      or (Pos(#13, NewPattern) > 0) or (Pos(#10, NewPattern) > 0) then
    SL.Text := StringReplace(SL.Text, OldPattern, NewPattern, Flags)
  else
    for i := SL.Count - 1 downto 0 do
      SL[i] := StringReplace(SL[i], OldPattern, NewPattern, Flags);
end;
(Achtung, das Overload ist wichtig, ansonsten die Prozedur einfach anders benennen)

youuu 21. Jul 2010 10:30

AW: StringReplace in TStringList
 
Danke, ich teste gleich mal die Performance.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:24 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 by Thomas Breitkreuz