Registriert seit: 12. Jun 2002
3.483 Beiträge
Delphi 10.1 Berlin Professional
|
Ein dynamisches Array aus einem String erzeugen
14. Mär 2003, 17:55
Eine Zeichenkette soll in ein dynamisches String-Array aufgeteilt werden. Unter PHP gibt es dazu die Funktion explode(). Delphi bietet jedoch von Haus aus keine solche an.
Delphi-Quellcode:
// Explode trennt S in die durch Separator getrennten Elemente auf. Wenn Limit
// > 0 ist, so werden max. Limit Elemente getrennt, wobei im letzen Element
// die Restzeichenkette steht.
function Explode(const Separator, S: string; Limit: Integer = 0): TStringDynArray;
var
SepLen: Integer;
F, P: PChar;
ALen, Index: Integer;
begin
SetLength(Result, 0);
if (S = '') or (Limit < 0) then Exit;
if Separator = '' then
begin
SetLength(Result, 1);
Result[0] := S;
Exit;
end;
SepLen := Length(Separator);
ALen := Limit;
SetLength(Result, ALen);
Index := 0;
P := PChar(S);
while P^ <> #0 do
begin
F := P;
P := AnsiStrPos(P, PChar(Separator));
if (P = nil) or ((Limit > 0) and (Index = Limit - 1)) then P := StrEnd(F);
if Index >= ALen then
begin
Inc(ALen, 5);
SetLength(Result, ALen);
end;
SetString(Result[Index], F, P - F);
Inc(Index);
if P^ <> #0 then Inc(P, SepLen);
end;
if Index < ALen then SetLength(Result, Index);
end;
// Implode fügt alle Elemente von Pieses in einen String aneinander, wobei die
// Elemente durch Glue getrennt werden.
function Implode(const Glue: string; const Pieces: array of string): string;
var
i, Len: Integer;
P: PChar;
GlueLen: Integer;
begin
GlueLen := Length(Glue);
Len := GlueLen * High(Pieces);
for i := 0 to High(Pieces) do Inc(Len, Length(Pieces[i]));
SetLength(Result, Len);
if Len > 0 then
begin
P := @Result[1];
for i := 0 to High(Pieces) do
begin
if (GlueLen > 0) and (i > 0) then P := StrLCopy(P, Pointer(Glue), GlueLen) + GlueLen;
Len := Length(Pieces[i]);
if Len > 0 then P := StrLCopy(P, Pointer(Pieces[i]), Len) + Len;
end;
end;
end;
Toxman fügte noch hinzu, dass TStringdynarray als type deklariert werden muss:
type TSTringdynarray = array of String;
Eine optimierte Version vom alzaimar gibt es in der Open-Source-Rubrik.
[edit=Matze]Link zur optimierten Version hinzugefügt. Mfg, Matze[/edit]
|
|
Zitat
|