![]() |
Effizienteste Datenverarbeitung eines Strings
Hallo zusammen
Ich habe folgende String struktur: <G48.51123,9.71545;G48.51123,9.71545;G48.51123,9.7 1545;G48.51123,9.71545;> Natürlich um einiges länger... Nun möchte ich nur die Nummern daraus erhalten also 48.51123 9.71545 . . . Wie mache ich dies am effizientesten? < und > signalisieren einen start und ein ende ein G signalisiert den beginn eines zweier blocks ein ; signalisiert das ende eines zweier blockes Danke schonmal |
AW: Effizienteste Datenverarbeitung eines Strings
Am effizientesten?
Code:
Das ist aber nicht wirklich am effizientesten, aber dafür am einfachsten zu implementieren. Optimal geht das eigentlich nur mit einer Schleife und ein wenig Fallunterscheidung.
start = 1;
wiederhole posG = Pos('G', Start); Verlasse die Schleife, wenn posG = 0; posKomma = Pos(',') ab PosG; Zahl1 = TextZwischen(posG + 1, posKomma - 1); posSemikolon =Pos(';') ab PosKomma; Zahl2 = TextZwischen(posSemikolon + 1, posKomma2 - 1); Start = posSemikolon + 1 |
AW: Effizienteste Datenverarbeitung eines Strings
Ich würde da den sledgehammer rausholen und mit Regulären Ausdrücken arbeiten.
|
AW: Effizienteste Datenverarbeitung eines Strings
stümmt.
|
AW: Effizienteste Datenverarbeitung eines Strings
Was verstehst du unter Effizient?
- einfach - einfach + etwas schneller - noch schneller (nicht so einfach) |
AW: Effizienteste Datenverarbeitung eines Strings
Danke für eure antworten...
Zitat:
es sei den etwas schneller ist zu langsam :) Es handelt sich um bis zu 128000 Zeichen Kannst du ein paar beispiele machen oder suchworte liefern? Danke :) Zitat:
|
AW: Effizienteste Datenverarbeitung eines Strings
Ungewünschte Zeichen herausfiltern geht auch mit stringReplace.
Delphi-Quellcode:
begin deinString := stringReplace(deinString, '<', '', [rfReplaceAll]); deinString := stringReplace(deinString, '>', '', [rfReplaceAll]); deinString := stringReplace(deinString, 'G', '', [rfReplaceAll]); deinString := stringReplace(deinString, ';', #13+#10, [rfReplaceAll]); deinString := stringReplace(deinString, ',', #13+#10, [rfReplaceAll]); end; |
AW: Effizienteste Datenverarbeitung eines Strings
Zitat:
Das dürfte wohl das schnellste sein :) Danke! :) |
AW: Effizienteste Datenverarbeitung eines Strings
StringReplace ist eher sehr langsam ... je länger der String und um so mehr Ersetzungen, um so langsamer wird es.
Aber wenn schon, dann könnte man ";G" in ein "," tauschen, dann noch "<G" und ">" entfernen ( ![]() Ansonsten würde ich es noch mit PosEx und Copy versuchen. |
AW: Effizienteste Datenverarbeitung eines Strings
das meine ich könnte relativ flott sein ....
eine Bremse könnte SetLength(a,High(a)+2); sein, hier gegf. einfach in größeren Blöcken anfordern und eine Zähler mitlaufen lassen ...
Delphi-Quellcode:
mit
TPointF=Record
x:Double; y:Double; End; TPointArray=Array of TPointF;
Delphi-Quellcode:
Procedure FillArray(var a:TPointarray;Const s:AnsiString);
var s1,s2:AnsiString; i,l,x1,x2:Integer; isFirst:Boolean; begin s1 := StringOfChar(#0,10); s2 := StringOfChar(#0,10); x1 := 0; x2 := 0; i := 1; l := Length(s); while i<l do begin if s[i] = 'G' then begin x1 := 0; isFirst := true end else if s[i] = ',' then begin x2 := 0; isFirst := false; inc(x1); s1[x1] := #0; end else if s[i] = ';' then begin x1 := 0; inc(x2); s2[x2] := #0; SetLength(a,High(a)+2); a[High(a)].X := StrToFloat(s1); a[High(a)].Y := StrToFloat(s2); end else if s[i] = '.' then begin if isFirst then begin inc(x1); s1[x1] := AnsiChar(Decimalseparator); end else begin inc(x2); s2[x2] := AnsiChar(Decimalseparator); end; end else if s[i] in ['0'..'9'] then begin if isFirst then begin inc(x1); s1[x1] := s[i]; end else begin inc(x2); s2[x2] := s[i]; end; end; inc(i); end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:07 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