![]() |
Delphi-Version: 10.2 Tokyo
Effiziente Methode, einen String mittels Delimiter zu splitten
Hallo!
Ich kenne mittlerweile ein halbes Dutzend Methoden, einen String anhand eines Delimiter zu splitten. Die meisten arbeiten mit TStringList. Entweder mit DelimitedText, was aber den Nachteil hat dass man nur ein Zeichen (Char) als Delimiter einsetzen kann. Oder mittels
Delphi-Quellcode:
Teilweise habe ich auch schon gesehen, den String mit einer Runner-Schleife zu durchlaufen, Memcopy je Zeichen in einen zweiten String zu machen und beim Auffinden eines Delimiter den zweiten String in eine Stringliste zu adden. Davon gibt es auch noch eine Variante, einen String als PChar anzusprechen, den Zeiger zu schubsen, Memcopy direkt auf StringList.Text zu machen und gefundene Delimiter durch sLineBreak zu ersetzen.
SL.Text:= StringReplace(TheString, TheDelimiter, sLineBreak, [rfReplaceAll]);
Nur frage ich mich, wie effizient ist denn diese ganze "Schleiferei"? Die meisten dieser Codeschnipsel sind 10 Jahre und älter. Gibt es vielleicht inzwischen in der RTL mitgeliefert schon eine Art Äquivalent zu der explode()-Funktion in PHP, die z.B. ein TStringDynArray auswirft? Grüße Cody EDIT: PS: Schön wäre die Möglichkeit, als Delimiter mehr als ein Zeichen (Char) verwenden zu können. |
AW: Effiziente Methode, einen String mittels Delimiter zu splitten
Suchst du sowas?
Delphi-Quellcode:
function Explode(const ADelimiter, AString: string): TArray<string>;
begin Result := AString.Split([ADelimiter]); end; StrOut := Explode(':;', StrIn); |
AW: Effiziente Methode, einen String mittels Delimiter zu splitten
In den neueren Versionen gibt es s.Split (s ist ein String).
|
AW: Effiziente Methode, einen String mittels Delimiter zu splitten
Ha, dacht ichs mir doch dass es inzwischen was generisches ab Werk gibt :-) Und dann auch noch so schön flexibel. Schade nur dass
![]() |
AW: Effiziente Methode, einen String mittels Delimiter zu splitten
Die Funktion SplitString gibt es in StrUtils schon seit D2010.
|
AW: Effiziente Methode, einen String mittels Delimiter zu splitten
Ich schätze mal dass dies einer dieser Fälle ist, wo das Internet voll ist mit wieder und wieder kopierten und modifizierten Varianten, die aus grauer Ansistring-Vorzeit stammen. Lässt man nämlich - mangels Kenntnis dessen - das Keyword "Split" weg oder verwendet stattdessen "explode" als Suchbegriff, findet man nur die altertümlichen Schleifenlösungen.
|
AW: Effiziente Methode, einen String mittels Delimiter zu splitten
Zitat:
Zumindest nicht in dem Sinn wie "generisch" in Delphi bzw. generell in Programmiersprachen benutzt wird. |
AW: Effiziente Methode, einen String mittels Delimiter zu splitten
Der Ergebnistyp ist generisch :-) Mehr meinte ich damit eigentlich gar nicht.
|
AW: Effiziente Methode, einen String mittels Delimiter zu splitten
Hier ein Mini Beispiel wie man es machen könnte:
Delphi-Quellcode:
Meintest Du so etwas?
procedure MySplit (const Delimiter: Char; Input: string; const Strings: TStrings);
begin Assert(Assigned(Strings)); Strings.Clear; Strings.Delimiter := Delimiter; Strings.DelimitedText := Input; end; // Aufruf: procedure TForm1.Button1Click(Sender: TObject); var SL: TStringList; begin SL := TStringList.Create; try MySplit(' ', 'Hallo Delphi Praxis', SL); ShowMessage(SL[0]); // = Hallo ShowMessage(SL[1]); // = Delphi ShowMessage(SL[2]); // = Praxis finally SL.Free; end; end; |
AW: Effiziente Methode, einen String mittels Delimiter zu splitten
Du hast den Eingangsbeitrag gelesen?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:38 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 by Thomas Breitkreuz