![]() |
AW: Effizienteste Datenverarbeitung eines Strings
Falls der String immer genau so aufgebaut ist,
also mit einem Buchstaben beim ersten Wert und mit abschließenden ";", dann ginge auch Folgendes "<" + "Gxxxx,yyyy;" + "Gxxxx,yyyy;" + ... + ">"
Delphi-Quellcode:
Statt dem Zwischenspeichern, in der StringListe, könnte man die beiden Zahlen auch direkt verarbeiten, am Ende der Schleife.
var
S: String; L: TStringList/TStrings; i, i2: Integer; S := '<G48.51123,9.71545;G48.51123,9.71545;G48.51123,9.71545;G48.51123,9.71545;>'; L.Clear; i := 1; while True do begin i2 := PosEx(',', S, i); if i2 = 0 then Break; L.Add(Copy(S, i + 2, i2 - i - 2)); i := PosEx(';', S, i2); if i = 0 then Break; L.Add(Copy(S, i2 + 1, i - i2 - 1)); end; |
AW: Effizienteste Datenverarbeitung eines Strings
Vielleicht auch ein Ansatz, wenn deine Terminus 'Einfachheit' bedeutet, daß du auf möglichst wenig fertige Funktionen (Pos, PosEx, etc.) verzichten willst:
![]() Nicht der optimalste und hübscheste Code, sollte aber für deine Geschichten funzen. Jan |
AW: Effizienteste Datenverarbeitung eines Strings
Zitat:
|
AW: Effizienteste Datenverarbeitung eines Strings
Oh, das sah da irgendwie anders aus, hatte mir den Code nicht komplett angesehn.
Pos sah nicht wie PosEx aus (waren ja nur zwei Parameter) und ich hate am Ende einfach (ohne hinzgucken) irgendwo ein Delete erwartet :oops: Nja, k.A. ob eine RegEx-Prüfung (da sie ja mehr prüfen muß) doch schneller ist ... zumindestens nicht, wenn das RegEx in Delphi geschrieben wäre X'D Hey, dann war ja gleich der erste Vorschlag so mit das Schnellste, was man wohl mit delphieigenen Mitteln so hinbekommen können würde:thumb: |
AW: Effizienteste Datenverarbeitung eines Strings
Zitat:
Delphi-Quellcode:
Es wird aber nicht auf die kleiner/größer Zeichen geachtet. Zumal die Zeichenfolge mit diesen Zeichen öffter vorkommen kann
L.Add(Copy(S, i + 2, i2 - i - 2));
|
AW: Effizienteste Datenverarbeitung eines Strings
Zitat:
Auf das ---> PRÜFEN <--- wurde verzichtet. Nix 'vergessen'. hab ich nicht geschrieben und auch nicht gemeint. Klar soweit ;-)
Delphi-Quellcode:
Getippt und nicht getestet.
Procedure ProcessInputString (const s: String);
Var state : TParserStates; // stWaitForTagOpen, stWaitForGee, stEatFirstNumber stEatSecondNumber; number1, number2 : String; i : Integer; begin state := stWaitForTagOpen; number1 := ''; number2 := ''; For i:=1 to length (s) do case state of stWaitForTagOpen : if s[i] = '<' Then state := stWaitForGee else Raise EParserException.Create('"<" expected'); stWaitForGee : case s[i] of 'G' : state := stEatFirstNumber; '>' : state := stEndOfInput; else Raise EParserException.CreateF('">" or "G" expected'); end; stEatFirstNumber : if s[i] = ',' Then state := stEatSecondNumber else number1 := number1 + s[i]; stEatSecondNumber : if s[i] = ';' then begin state := stWaitForGee; ProcessNumbers (number1, number2); number1 := ''; number2 := ''; end else number2 := number2 + s[i]; end; if state <>stEndOfInput Then Raise EParserError ('Unexpected EOF'); end; Sollte eigentlich am Schnellsten sein (ok, mit PChar vielleicht noch schneller), denn es gibt nur eine Schleife und man geht nur 1x von vorne nach hinten. |
AW: Effizienteste Datenverarbeitung eines Strings
Zitat:
|
AW: Effizienteste Datenverarbeitung eines Strings
Je weniger man prüft, um so schneller geht es. (das ersparrt bestimmt nichmal 'ne halbe Millisekunde :stupid: )
|
AW: Effizienteste Datenverarbeitung eines Strings
Die Vergabe der Namen ist köstlich
Delphi-Quellcode:
.
stEatFirstNumber, stEatSecondNumber
Musste mal gesagt werden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:22 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