Entwickler-Ecke
Open Source Units - verbesserte GetToken/NumToken-Methode
aM0xACiLLiN - Sa 17.04.04 21:43
Titel: verbesserte GetToken/NumToken-Methode
Hi,
im Netz kursiert ja eine recht bekannte GetToken-Methode, die allerdings doppelt so langsam wie meine ist.
Kurze Erklärung: Mit GetToken bekommt man den Teil eines Strings.
Beispiel:
Delphi-Quelltext
1: 2: 3:
| string:='abc def geh'; SubString:=GetToken(string,' ',2); |
Edit:18.04.2004,11:23 Bugfix für Rückgabe, wenn der Seperator nicht enthalten ist
Hier die Unit:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45:
| unit _Tokens;
interface function GetToken(source, token: string; number: integer):string; function NumToken(aString:string; sepchar: string):integer;
implementation
function _Pos(token, source:string):integer; var c:integer; begin c:=Pos(token,source); if (c = 0) then result:=length(source) else result:=c; end;
function GetToken(source, token: string; number: integer):string; var c:integer; t:string; begin if (pos(token,source) = 0) then begin if (number = 1) then result:=source else result:=''; exit; end; t:=source; for c:=0 to (number-2) do Delete(t,1,_Pos(token,t)); if (Pos(token,t) > 0) then result:=copy(t,1,pos(token,t)-1) else result:=t; end;
function NumToken(aString:string; sepchar: string):integer; var c,num:integer; t:string; begin t:=aString; num:=0; for c:=0 to (length(t)-1) do if (t[c] = sepchar) then Inc(num); result:=num+1; end;
end. |
Ich stehe gerne für Fragen zur Verfügung.
cu
Anonymous - So 18.04.04 11:58
NumToken dürfte IMO Probleme machen, wenn sepchar mehr als einen Buchstaben hast, weil du einen Char mit einem String vergleichst.
aM0xACiLLiN - So 18.04.04 13:40
Hi,
ja, allerdings gehe ich davon aus, dass sepchar immer nur 1 buchstabe ist.. hätte ich dazuschreiben sollen ;)
Angepasst sieht die Funktion dann so aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| function NumToken(aString:string; sepchar: string):integer; var c,num:integer; t:string; begin t:=aString; num:=0; for c:=0 to (length(t)-1) do if (copy(t,c,length(sepchar)) = sepchar) then Inc(num); result:=num+1; end; |
cu
Anonymous - So 18.04.04 15:41
Jetzt gibt es unter Umständen (aber mit beiden Funktionen) Probleme, wenn Anfang und Ende des Trenners gleich sind. 'abababa' mit Trenner 'bab' sollte zum Beispiel 'a' und 'aba' ergeben, ergibt aber 'a', 'a', 'a' und 'aba' (obwohl NumToken als Anzahl '3' Ausgibt)
//Edit:
scheinbar gibt es generell Probleme mit längeren Trennern.
'testte##sttest' und '##':
NumToken: 2, stimmt
GetToken: 'testte', 'testte', '#sttest'
//Edit:
So funktionierts:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| function GetToken(source, token: string; number: integer):string; var c:integer; t:string; begin if (pos(token,source) = 0) then begin if (number = 1) then result:=source else result:=''; exit; end; t := source; for c:= 0 to (number-1) do Delete(t,1,_Pos(token,t)+length(token)-1); if (Pos(token,t) > 0) then result := copy(t,1,pos(token,t)-1) else result:=t; end; |
aM0xACiLLiN - So 18.04.04 16:03
Hi,
danke für die kleine verbesserung. Wie schon erwähnt brauche ich diese Funktionen nur für ein-buchstabige-trenner und hab diesen kleinen Fehler deshalb vorher nicht entdeckt..
cu
Anonymous - So 18.04.04 16:32
Dann solltest du eventuell den Typ des Trenners in "char" umstellen.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!