![]() |
Strings trennen
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: :coder:
Delphi-Quellcode:
Eine klitzekleine Procedur um den Code zu testen:
{-----------------------------------------------------------------------------
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;
Delphi-Quellcode:
Ich bin sicher ich habe den ein oder anderen Fehler übersehen, oder hätte das ein oder andere eleganter/sicherer gestalten können.
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; Gruß Alexander PS: Bitte verzeiht mir meine Deutsch Englisch Mischung :oops: , 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] |
Re: Strings trennen
Sowas ähnliches hab ich auch mal gemacht:
![]() Und wie man sieht gibts für ähnliche Probleme ähnliche Ansätze und unterschiedliche Ausführungen... mfg Christian |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:15 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz