Autor Beitrag
aM0xACiLLiN
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64



BeitragVerfasst: Sa 17.04.04 21:43 
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:
ausblenden Delphi-Quelltext
1:
2:
3:
string:='abc def geh';
SubString:=GetToken(string,' ',2);
//SubString = 'def'


Edit:18.04.2004,11:23 Bugfix für Rückgabe, wenn der Seperator nicht enthalten ist

Hier die Unit:
ausblenden volle Höhe 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:
{(c) 2004 aM0xACiLLiN
GetToken(source,seperator,number);
NumToken(source,seperator);
}

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 = 0then 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) = 0then begin 
  if (number = 1then result:=source else result:='';
  exit; 
 end
 t:=source; 
 for c:=0 to (number-2do 
  Delete(t,1,_Pos(token,t)); 
 if (Pos(token,t) > 0then 
 result:=copy(t,1,pos(token,t)-1else 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)-1do
 if (t[c] = sepchar) then
  Inc(num);
result:=num+1;
end;

end.


Ich stehe gerne für Fragen zur Verfügung.

cu
obbschtkuche
Gast
Erhaltene Danke: 1



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64



BeitragVerfasst: 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:
ausblenden 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)-1do 
 if (copy(t,c,length(sepchar)) = sepchar) then 
  Inc(num); 
result:=num+1
end;


cu
obbschtkuche
Gast
Erhaltene Danke: 1



BeitragVerfasst: 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:

ausblenden 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) = 0then
 begin
  if (number = 1then
   result:=source
  else
   result:='';
  exit;
 end;
 t := source;
 for c:= 0 to (number-1do
  Delete(t,1,_Pos(token,t)+length(token)-1);
 if (Pos(token,t) > 0then
  result := copy(t,1,pos(token,t)-1)
 else result:=t;
end;
aM0xACiLLiN Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64



BeitragVerfasst: 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
obbschtkuche
Gast
Erhaltene Danke: 1



BeitragVerfasst: So 18.04.04 16:32 
Dann solltest du eventuell den Typ des Trenners in "char" umstellen.