String mit Delimiter zu einem Array parsen

Vorstellungen von Programmen, welche mit Lazarus erstellt wurden.
Antworten
LazyBone
Beiträge: 6
Registriert: Do 21. Apr 2016, 14:20

String mit Delimiter zu einem Array parsen

Beitrag von LazyBone »

Hallo Forum und alle suchenden Freunde,
weiß nicht, ob ich hier richtig bin, aber da ich selber auf der Suche nach so etwas war, stelle ich euch einfach mal einen Schnipsel Code zur Verfügung, der einen String s mit Delimitern delim in ein Array aus Einzelstrings aufteilt.
Wichtig ist hier die unit StrUtils!


Code: Alles auswählen

 
uses StrUtils...
...
type TStringArray = Array Of String;
...
 
function ParseStrToArray(const s:string; delim: char):TStringArray;
   var tsa: TStringArray;
       sbuf: string;
       x: byte;
   begin
     if s='' then
        begin
           result := nil;
           exit;
        end;
     sbuf := s;
     setlength(tsa,0);
     x := PosEx(delim,sbuf);
     while (x > 0) or (length(sbuf)>0) do
        begin
           setlength(tsa,length(tsa)+1);
           if (x=0) and (length(sbuf)>0) then
              tsa[length(tsa)-1] := sbuf
           else
              tsa[length(tsa)-1] := leftstr(sbuf, x-1);
           if (x=0) and (length(sbuf)>0) then
              sbuf := ''
           else
              sbuf := rightstr(sbuf,length(sbuf)-x);
           x := PosEx(delim,sbuf);
        end;
     result := tsa;
   end;


Macht dann z.B. aus einem String s='A12;BX;XV;VG' und delim=';' das Array ['A12','BX','XV','VG]

Hat bisher gute Dienste geleistet...
Je nach Länge des eingegebenen Strings kann Byte für x ggf knapp werden, dann doch einfach einen longword oder was draus machen :mrgreen:
Viele Grüße!

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: String mit Delimiter zu einem Array parsen

Beitrag von Mathias »

Praktische Funktion, sowas habe ich auch schon gebraucht.

aber da ich selber auf der Suche nach so etwas war,


Ab FPC 3.1 ist diese Funktion direkt eingebaut.

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
const
  s = 'A12;BX;XV;VG';
var
  sr: TStringArray;
  i: integer;
begin
  sr := s.Split(';');
  for i := 0 to Length(sr) - 1 do begin
    Memo1.Lines.Add(sr[i]);
  end;
end;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: String mit Delimiter zu einem Array parsen

Beitrag von theo »

...oder ähnlich auch TStringList

Code: Alles auswählen

var Sl:TStringList;
  i: Integer;
begin
 Sl:=TStringList.Create;
 Sl.Delimiter:=';';
 Sl.DelimitedText:='A12;BX;XV;VG';
 for i :=0 to Sl.Count-1 do ShowMessage(Sl[i]);
 Sl.Free;;
end;   

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: String mit Delimiter zu einem Array parsen

Beitrag von Mathias »

Mit der StringList hat es mit früher auch weiter geholfen.

Ich habe gerade festgestellt, das Spilt noch einen weg weiter geht, man kann mehrere Trenn-Zeichen eingeben.
So wie ich mich erinnern mag, hatte fpc 3.1 Anfangs Jahr dies mit der Char-Array noch nicht eingebaut.

Hat StringList so etwas auch eingebaut ?

Code: Alles auswählen

const
  s = 'A12;BX;XV;VGA;12.BX.XV.VG';
var
  sr: TStringArray;
  i: integer;
begin
  sr := s.Split([';','.']);
  for i := 0 to Length(sr) - 1 do begin
    Memo1.Lines.Add(sr[i]);
  end;
end


FPC wird immer besser. :P
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten