Einzelnen Beitrag anzeigen

jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#1

Ein dynamisches Array aus einem String erzeugen

  Alt 14. Mär 2003, 16: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]
  Mit Zitat antworten Zitat