Thema: Delphi Strings trennen

Einzelnen Beitrag anzeigen

Benutzerbild von Alexander Roth
Alexander Roth

Registriert seit: 17. Mai 2004
Ort: Kenn
574 Beiträge
 
Turbo Delphi für Win32
 
#1

Strings trennen

  Alt 14. Aug 2006, 18:38
Hi,

also ihr kennt sicher das Problem, dass immer mal wieder auftritt, dass man Strings nach bestimmten Trennzeichen Trennen muss. Als ich heute morgen kam mir die Frage, wieso nicht eine allgemeine Funktion schreiben, die all diese Problemstellungen erschlägt.

Hier kommt der Code:
Delphi-Quellcode:
{-----------------------------------------------------------------------------
  Description:  Zerteilt einen String; Zerteilung erfolgt anhand von
                Teilstrings, die nicht mit ausgegeben werden
  Author:      Alexander Roth
  Procedure:    DivideList
  Arguments:    s:string; const Separator, DivideList:TStrings
-----------------------------------------------------------------------------}
 
procedure DivideList(s:string; const Separator, DivideList:TStrings);

    function FindNext:TPoint; // sucht den als ersten vorkommenden Seperator

    var i:integer;
        tempstelle:integer;
        schongefunden:boolean; // führe ich ein, damit er auf jeden Fall
                               // die 1. Fundstelle aufschreibt
    begin
      schongefunden:=false;
      result.y:=0;
      result.x:=0;
      for i:=0 to Separator.Count-1 do begin

        tempstelle:=pos(Separator.Strings[i], s);
        //schreibt die als nächstes kommende Trennzeichenstelle auf
        if (tempstelle > 0)
           and ((tempstelle < result.y) or not schongefunden) then

           // es darf niemals sein dass er eine stelle
           // aufschreibt die nicht da ist
        begin
          schongefunden:=true;
          result.y:=tempstelle;
          result.x:=i;
        end;
      end;
    end;

var tempS:string;
    find:TPoint; // y = Fundstelle, x = Index des Separators;

                  // hier habe ich keinen eigenen Typ gewählt,
                  // der übersichtlicher wäre, um die Implementierung des
                  // Codes einfacher zu gestalten
begin
  if assigned(Separator) and assigned(DivideList) then

  begin
    if (s <> '') and (Separator.Count > 0) then // falls man irgendwelche

                                                // schrottige Angaben gemacht hat
                                                // wird man hier rausgeworfen
    begin
      find:=FindNext;

      while (find.y > 0) and (length(s) > 0) do
      begin
        tempS:=copy(s, 1, find.Y-1);

        if length(tempS) > 0 then
          DivideList.Append(tempS);
        delete(s, 1, find.y-1 + length(Separator[find.x]));

        find:=FindNext;
      end;
      if length(s) > 0 then
        DivideList.Append(s);
    end;
  end;

end;
Eine klitzekleine Procedur um den Code zu testen:

Delphi-Quellcode:
procedure DemoDivideString;
const s = ',;,hallo|;guda,ggt;ds|gh,d;,;;;,f;,g,';
var StrList, NewList:TStringlist;
    i:integer;
begin
  StrList:=TStringlist.Create;
  NewList:=TStringlist.Create;
  try
    StrList.Append(',');
    StrList.Append(';');
    StrList.Append('|');

    DivideString(s, StrList, NewList);
    for i :=0 to NewList.Count-1 do
      ShowMessage(
        NewList.Strings[i]+#13+
        inttostr(length(NewList.Strings[i]))
      );
  finally
    NewList.free;
    StrList.free;
  end;
end;
Ich bin sicher ich habe den ein oder anderen Fehler übersehen, oder hätte das ein oder andere eleganter/sicherer gestalten können.


Gruß Alexander


PS: Bitte verzeiht mir meine Deutsch Englisch Mischung , aber ich versuche halt so viel wie möglich in Englisch zu machen, gebrauche aber dann doch hin und wieder Deutsche Begriffe.

[edit=Matze]Überarbeitete Version von omata eingefügt. Mfg, Matze[/edit]
[edit=JasonDX] Auf Wunsch von Alexander eine korrigierte Version eingefuegt. Mfg, JasonDX[/edit]
[edit=CalganX]Auf Wunsch nochmal eine Korrektur eingefügt. Mfg, CalganX[/edit]
Alexander Roth
Ich bin umgestiegen auf: Lazarus und Ubuntu! Alles OpenSource!

Besuch doch mal: www.roth.us.ms
  Mit Zitat antworten Zitat