Entwickler-Ecke

Sonstiges - ...einen unterteilten String in ein Array schreiben?


Tweafis - So 22.06.03 17:33
Titel: ...einen unterteilten String in ein Array schreiben?
Zuerst möchte ich sagen, dass ich das nicht selbst geschrieben habe, sondern jbg in diesem [http://www.delphipraxis.net/post25415.html#25415] Thread.

Die funktion dient dazu einen String der durch ein bestimmtes Zeichen bzw durch eine bestimtme Zeichenkette unterteilt ist in ein Array zu schreiben. Unter PHP gibt es diese funktion von Haus aus, und sie nennt sich explode.


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:
{-----------------------------------------------------------------------------
  Procedure : Explode
  Purpose   : Seperates a CSV-line
  Arguments : const Separator, S: string; Limit: Integer = 0
  Result    : TStringDynArray
-----------------------------------------------------------------------------}

type
  TStringDynArray = array of string;

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 < 0then 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 := StrPos(P, PChar(Separator));
    if (P = nilor ((Limit > 0and (Index = Limit - 1)) then P := StrEnd(F);
    if Index >= ALen then
    begin
      Inc(ALen, 5); // mehrere auf einmal um schneller arbeiten zu können
      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); // wirkliche Länge festlegen
end;


Aufrufen könnt ihr die Funktion z.B. so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
var
  s: string;
  exparr: TStringDynArray;
  x: integer;

begin
  s := 'ErstesElement||fooo||blabla||töhö';  // Dieser String wird in das Array geschrieben.
  exparr := explode('||', s); // String in Array speichern.

  for x:=0 to High(exparr) do // alle Elemente durchlaufen
    ShowMessage('String = '+s+#13+#10+'Index = '+inttostr(x)+#13+#10+#13+#10+exparr[x]);  // und eine Messagebox ausgeben
end;


Ihr solltet hierbei nacheinander Message Boxes bekommen die so aussehen:
Zitat:
String = ErstesElement||fooo||blabla||töhö
Index = 0,1,2,3

Das entsprechende Item