AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Stringverarbeitung optimieren (split)

Ein Thema von Pichel · begonnen am 12. Apr 2006 · letzter Beitrag vom 12. Apr 2006
Antwort Antwort
Benutzerbild von Pichel
Pichel

Registriert seit: 25. Feb 2005
Ort: Kassel
65 Beiträge
 
Delphi 7 Professional
 
#1

Re: StringReplace und doppelte Leerzeichen

  Alt 12. Apr 2006, 13:25
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

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

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;
Grüße aus Kassel.

Konfuzius sprach: Etwas lernen und sich immer wieder darin üben - schafft das nicht auch Befriedigung?
  Mit Zitat antworten Zitat
DerDan

Registriert seit: 15. Nov 2004
Ort: Donaueschingen
251 Beiträge
 
Delphi XE3 Professional
 
#2

Re: StringReplace und doppelte Leerzeichen

  Alt 12. Apr 2006, 13:35
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
nichts ist so schön wie man es sich vorstellt
  Mit Zitat antworten Zitat
Benutzerbild von Pichel
Pichel

Registriert seit: 25. Feb 2005
Ort: Kassel
65 Beiträge
 
Delphi 7 Professional
 
#3

Re: StringReplace und doppelte Leerzeichen

  Alt 12. Apr 2006, 13:49
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

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.
Grüße aus Kassel.

Konfuzius sprach: Etwas lernen und sich immer wieder darin üben - schafft das nicht auch Befriedigung?
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: Stringverarbeitung optimieren (split)

  Alt 12. Apr 2006, 15:16
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).
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort


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 13:17 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