AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Effizienteste Datenverarbeitung eines Strings

Ein Thema von hedie · begonnen am 19. Okt 2011 · letzter Beitrag vom 21. Okt 2011
Antwort Antwort
Seite 2 von 2     12
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.104 Beiträge
 
Delphi 12 Athens
 
#11

AW: Effizienteste Datenverarbeitung eines Strings

  Alt 19. Okt 2011, 22:57
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:
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;
Statt dem Zwischenspeichern, in der StringListe, könnte man die beiden Zahlen auch direkt verarbeiten, am Ende der Schleife.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.

Geändert von himitsu (19. Okt 2011 um 23:01 Uhr)
  Mit Zitat antworten Zitat
BoolString

Registriert seit: 2. Feb 2009
Ort: Varel
70 Beiträge
 
RAD-Studio 2009 Pro
 
#12

AW: Effizienteste Datenverarbeitung eines Strings

  Alt 19. Okt 2011, 23:32
Vielleicht auch ein Ansatz, wenn deine Terminus 'Einfachheit' bedeutet, daß du auf möglichst wenig fertige Funktionen (Pos, PosEx, etc.) verzichten willst:

Zahlen aus Strings extrahieren

Nicht der optimalste und hübscheste Code, sollte aber für deine Geschichten funzen.

Jan
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#13

AW: Effizienteste Datenverarbeitung eines Strings

  Alt 20. Okt 2011, 08:05
Delphi-Quellcode:
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;
Eine gelungene Umsetzung des ersten Vorschlags, nur das auf das Prüfen von 'G' verzichtet wird.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.104 Beiträge
 
Delphi 12 Athens
 
#14

AW: Effizienteste Datenverarbeitung eines Strings

  Alt 20. Okt 2011, 09:49
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

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
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.

Geändert von himitsu (20. Okt 2011 um 09:53 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.295 Beiträge
 
Delphi 12 Athens
 
#15

AW: Effizienteste Datenverarbeitung eines Strings

  Alt 20. Okt 2011, 09:53
Eine gelungene Umsetzung des ersten Vorschlags, nur das auf das Prüfen von 'G' verzichtet wird.
Ne.Das "G" wurde nicht vergessen. Er geht davon aus, daß einer Zahl vor einem Komma immer ein G vorangestellt ist. Deshalb in der Copy-Funktion das "+2".

L.Add(Copy(S, i + 2, i2 - i - 2)); Es wird aber nicht auf die kleiner/größer Zeichen geachtet. Zumal die Zeichenfolge mit diesen Zeichen öffter vorkommen kann
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#16

AW: Effizienteste Datenverarbeitung eines Strings

  Alt 20. Okt 2011, 22:22
Eine gelungene Umsetzung des ersten Vorschlags, nur das auf das Prüfen von 'G' verzichtet wird.
Ne.Das "G" wurde nicht vergessen.
Lesen müsste man können. "nur auf DAS PRÜFEN von 'G'..." PRÜFEN! PRÜFEN!
Auf das ---> PRÜFEN <--- wurde verzichtet.

Nix 'vergessen'. hab ich nicht geschrieben und auch nicht gemeint. Klar soweit

Delphi-Quellcode:
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;
Getippt und nicht getestet.

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.

Geändert von Furtbichler (20. Okt 2011 um 22:29 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.295 Beiträge
 
Delphi 12 Athens
 
#17

AW: Effizienteste Datenverarbeitung eines Strings

  Alt 21. Okt 2011, 09:20
Lesen müsste man können. "nur auf DAS PRÜFEN von 'G'..." PRÜFEN! PRÜFEN!
Auf das ---> PRÜFEN <--- wurde verzichtet.

Nix 'vergessen'. hab ich nicht geschrieben und auch nicht gemeint. Klar soweit
Na dann.....
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.104 Beiträge
 
Delphi 12 Athens
 
#18

AW: Effizienteste Datenverarbeitung eines Strings

  Alt 21. Okt 2011, 09:30
Je weniger man prüft, um so schneller geht es. (das ersparrt bestimmt nichmal 'ne halbe Millisekunde )
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.295 Beiträge
 
Delphi 12 Athens
 
#19

AW: Effizienteste Datenverarbeitung eines Strings

  Alt 21. Okt 2011, 09:39
Die Vergabe der Namen ist köstlich stEatFirstNumber, stEatSecondNumber .

Musste mal gesagt werden.
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 12:15 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