Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Effiziente Methode, einen String mittels Delimiter zu splitten (https://www.delphipraxis.net/195958-effiziente-methode-einen-string-mittels-delimiter-zu-splitten.html)

Codehunter 11. Apr 2018 08:14

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:
SL.Text:= StringReplace(TheString, TheDelimiter, sLineBreak, [rfReplaceAll]);
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.

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.

günni0 11. Apr 2018 08:16

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);

Neutral General 11. Apr 2018 08:17

AW: Effiziente Methode, einen String mittels Delimiter zu splitten
 
In den neueren Versionen gibt es s.Split (s ist ein String).

Codehunter 11. Apr 2018 08:26

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 die Dokumentation dazu so dünne ist.

Uwe Raabe 11. Apr 2018 08:31

AW: Effiziente Methode, einen String mittels Delimiter zu splitten
 
Die Funktion SplitString gibt es in StrUtils schon seit D2010.

Codehunter 11. Apr 2018 08:37

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.

Neutral General 11. Apr 2018 08:49

AW: Effiziente Methode, einen String mittels Delimiter zu splitten
 
Zitat:

Zitat von Codehunter (Beitrag 1398712)
Ha, dacht ichs mir doch dass es inzwischen was generisches ab Werk gibt :-)

Nur als kleiner Hinweis: An der Methode ist nichts "generisch" ;)
Zumindest nicht in dem Sinn wie "generisch" in Delphi bzw. generell in Programmiersprachen benutzt wird.

Codehunter 11. Apr 2018 08:53

AW: Effiziente Methode, einen String mittels Delimiter zu splitten
 
Der Ergebnistyp ist generisch :-) Mehr meinte ich damit eigentlich gar nicht.

KodeZwerg 11. Apr 2018 09:07

AW: Effiziente Methode, einen String mittels Delimiter zu splitten
 
Hier ein Mini Beispiel wie man es machen könnte:
Delphi-Quellcode:
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;
Meintest Du so etwas?

Daniel 11. Apr 2018 09:18

AW: Effiziente Methode, einen String mittels Delimiter zu splitten
 
Du hast den Eingangsbeitrag gelesen?
Zitat:

Zitat von Codehunter (Beitrag 1398707)
Ich kenne mittlerweile ein halbes Dutzend Methoden, einen String anhand eines Delimiter zu splitten. Die meisten arbeiten mit TStringList. Entweder mit DelimitedText, [...]



Alle Zeitangaben in WEZ +1. Es ist jetzt 16:22 Uhr.
Seite 1 von 2  1 2      

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