Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Stringverarbeitung optimieren (split) (https://www.delphipraxis.net/67286-stringverarbeitung-optimieren-split.html)

Pichel 12. Apr 2006 12:25


Re: StringReplace und doppelte Leerzeichen
 
Also mit diesem Thread habt Ihr mir schon ungemein geholfen.

Aber wo schon so ein Millisekungen-Run entstanden ist habe ich da noch eine Aufgabe :wink:

Vorab, ich werte eine relativ große Webseite bzw. deren Html-code aus.
Dafür ist es nötig bestimmte Stellen zu finden, genauer der String der zwischen StringA und StringB steckt.
Da ich diese zwei, ich nenne sie mal IdentifierungsStrings aus einer ini lese habe ich sie dort mit einem "|" getrennt...
Daher musste ich auch einen String um alle doppelten Leerzeichen erleichtern sowie alle #9 #10 #13 entfernen damit die Identifzierung zuverlässiger ist.

So... nun hab ich mir also nen Funktion gebastelt die sehr häufig aufgerufen wird und bestimmt aufgrund der vielen Pos, Copy und Delete Befehle nicht gerade schnell ist.
als Variable "s" übergebe ich den Quelltext zB 'Mein Benutzername hier im Forum ist Pichel, mal so als Beispieltext.'
und als var "ids" den Identifizierungsstring zB 'Mein Benutzername hier im Forum ist |,'
Die Funktion liefert nun 'Pichel' als Result zurück und der Html-Quelltext ist gekürzt auf ' mal so als Beispieltext.'

Ich hoffe das war soweit zu verstehen... und hier nun der Code auf das ich noch was lernen kann :thumb:

Delphi-Quellcode:
function GetDataSet(var s: String; ids: String): String;
var id1, id2: String;
begin
  Result := '';
  if Pos('|',ids) > 0 then begin // IDs splitten
    id1 := copy(ids, 1, pred(Pos('|',ids)));
    id2 := copy(ids, succ(Pos('|', ids)), length(ids));
  end else begin
    id1 := '';
    id2 := ids;
  end;
  if (id1 = '') or (Pos(id1, s) > 0) then begin
    if id1 <> '' then delete(s,1,pred(Pos(id1, s)+length(id1)));
    if (Pos(id2, s) > 0) then begin
      Result := trim(copy(s, 1, pred(Pos(id2, s))));
      delete(s,1,pred(Pos(id2, s)+length(id2)));
    end;
  end;
end;

DerDan 12. Apr 2006 12:35

Re: StringReplace und doppelte Leerzeichen
 
Das hört sich eher an als bräuchtest einen gscheiden Parser!

Wie groß sind deine Seiten denn?

Ich würd sie in ein TMemoryStream laden und dann mit einem Pointer drüber gehen,
bis dein StartString / StopString erkannt wird ...


mfg

DerDan

Pichel 12. Apr 2006 12:49

Re: StringReplace und doppelte Leerzeichen
 
Zitat:

Zitat von DerDan
Das hört sich eher an als bräuchtest einen gscheiden Parser!
Wie groß sind deine Seiten denn?

Richtig, der String hat teilweise ne Länge von ca 100000 Zeichen, und da ich da recht häufig mit der Funktion reingehen geht die benötigte Zeit auf meinem System fast in Richtung einer Sekunde was zwar tragbar wäre aber ich will ja auch gerne was lernen :-D

Zitat:

Zitat von DerDan
Ich würd sie in ein TMemoryStream laden und dann mit einem Pointer drüber gehen,
bis dein StartString / StopString erkannt wird ...

Tja... und genau mit diesen Pointern stehe ich irgendwie immer auf "Kriegsfuß". Diese ^ davor und dahinter oder @ bringe ich immer irgendwie so durcheinander dass ich dann irgendwann genervt aufgebe.

alzaimar 12. Apr 2006 14:16

Re: Stringverarbeitung optimieren (split)
 
Dafür eignet sich der Boyer-Moore Stringmatching-Algorithmus am Besten. Er dürfte auch der Schnellste sein, vor allen Dingen, wenn Du mit ein und dem selben Suchstring öfter suchen tust (autsch).


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:16 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