AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Strings trennen

Ein Thema von Alexander Roth · begonnen am 14. Aug 2006 · letzter Beitrag vom 14. Aug 2006
Antwort Antwort
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
r2c2

Registriert seit: 9. Mai 2005
Ort: Nordbaden
925 Beiträge
 
#2

Re: Strings trennen

  Alt 14. Aug 2006, 19:41
Sowas ähnliches hab ich auch mal gemacht: http://www.delphipraxis.net/internal...ct.php?t=72330

Und wie man sieht gibts für ähnliche Probleme ähnliche Ansätze und unterschiedliche Ausführungen...

mfg

Christian
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat
Antwort Antwort

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:53 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz