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 = 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
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)-1) do 
 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) = 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 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.