Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi String splitten in TArray<string> (https://www.delphipraxis.net/207246-string-splitten-tarray-string.html)

Mavarik 6. Mär 2021 12:41

String splitten in TArray<string>
 
Wenn ich es richtig sehen, nutzen viele eine TStringliste um aus einem String mit Delimiter ein TArray<String> zu machen.
Die Stringliste sieht - wie wahrscheinlich viele das Ende eines Strings an, wenn es ein #0 findet.

Ein:

Delphi-Quellcode:
Var
  S : String;
  A : TArray<String>;
begin
  S := 'Frank;Pet'+#0+'er;Elke';
  A := Split(S,';');
end;
Würde also ein Array erzeugen
Delphi-Quellcode:
['Frank','Pet']
Für viele Anwendungen währe das sicherlich ok, weil Strings i.d.R. kein #0 enthalten...

Was ist mit
Delphi-Quellcode:
Split('Frank;"Peter";Elke');
Soll das
Delphi-Quellcode:
['Frank','Peter','Elke']
ergeben oder doch eher
Delphi-Quellcode:
['Frank','"Peter"','Elke']
?

Weil wenn ich einen String habe:
Delphi-Quellcode:
'Frank;Delimiter können ";" oder auch ",";sein'
möchte ich doch lieber das Array
Delphi-Quellcode:
['Frank','Delimiter können ";" oder auch ","','sein']
haben.

Oder?

Grüsse Mavarik :coder'

Uwe Raabe 6. Mär 2021 13:16

AW: String splitten in TArray<string>
 
Ich finde, der String-Helper macht das schon ganz gut:
Delphi-Quellcode:
procedure Main;
Var
  S : String;
  A : TArray<String>;
begin
  S := 'Frank;Pet'+#0+'er;Elke';
  A := S.Split([';']);
  Assert(Length(A) = 3);
  S := 'Frank;Delimiter können ";" oder auch ",";sein';
  A := S.Split([';',','], '"', '"');
  Assert(Length(A) = 3);
end;

Mavarik 8. Mär 2021 09:19

AW: String splitten in TArray<string>
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1484544)
Ich finde, der String-Helper macht das schon ganz gut:

Ach...
Bei dir bricht er nicht beim #0 ab?
Es ging mir auch nicht darum, das es verschiedene Delimiter gibt, sondern ob ich erwarte die QuoteChars im finalen Array zu haben oder nicht!

Uwe Raabe 8. Mär 2021 09:39

AW: String splitten in TArray<string>
 
Zitat:

Zitat von Mavarik (Beitrag 1484618)
Bei dir bricht er nicht beim #0 ab?

Nein. Andernfalls hätte das Array ja auch nur zwei Einträge und die erste Assertion würde ansprechen.

Gandalf2265 8. Mär 2021 09:46

AW: String splitten in TArray<string>
 
Hallo Frank,

im Beispiel von Uwe bricht er bei mir beim dem #0 auch nicht ab sondern nimmt es mit in den String.
Eventuell ein Unterschied zwischen 10.3 und 10.4?

Mavarik 8. Mär 2021 09:47

AW: String splitten in TArray<string>
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1484623)
Zitat:

Zitat von Mavarik (Beitrag 1484618)
Bei dir bricht er nicht beim #0 ab?

Nein. Andernfalls hätte das Array ja auch nur zwei Einträge und die erste Assertion würde ansprechen.

Mit welchem compiler? Bei mir geht es nicht!

Mavarik

Mavarik 8. Mär 2021 09:48

AW: String splitten in TArray<string>
 
Liste der Anhänge anzeigen (Anzahl: 1)
10.4.2

DeddyH 8. Mär 2021 09:50

AW: String splitten in TArray<string>
 
Du benutzt ja auch nicht Uwes Code, sondern eine Stringliste.

Mavarik 8. Mär 2021 09:54

AW: String splitten in TArray<string>
 
Zitat:

Zitat von DeddyH (Beitrag 1484627)
Du benutzt ja auch nicht Uwes Code, sondern eine Stringliste.

Danke...

Ich habe nicht gesehen, dass Uwe nicht auf meine Fragestellung eingegangen ist...

Zitat:

Zitat von Mavarik (Beitrag 1484543)
Wenn ich es richtig sehen, nutzen viele eine TStringliste um aus einem String mit Delimiter ein TArray<String> zu machen.


Das klärt es!

Uwe Raabe 8. Mär 2021 10:18

AW: String splitten in TArray<string>
 
Zitat:

Zitat von Mavarik (Beitrag 1484628)
Ich habe nicht gesehen, dass Uwe nicht auf meine Fragestellung eingegangen ist...

Schon, wenn man nicht nur das Verhalten der TStringList in Frage stellen will, sondern eine Lösung für das Split-Problem möchte:

Zitat:

Zitat von Uwe Raabe (Beitrag 1484544)
Ich finde, der String-Helper macht das schon ganz gut

Hier übrigens der Code erweitert für das Quotes oder Nicht-Quotes Problem
Delphi-Quellcode:
Var
  S : String;
  A : TArray<String>;
begin
  S := 'Frank;Pet'+#0+'er;Elke';
  A := S.Split([';']);
  Assert(Length(A) = 3);

  S := 'Frank;"Peter";Elke';
  A := S.Split([';']);
  Assert(Length(A) = 3);
  Assert(A[1] = '"Peter"');

  A := S.Split([';"', '";', ';']); // Reihenfolge ist wichtig!
  Assert(Length(A) = 3);
  Assert(A[1] = 'Peter');

  S := 'Frank;Delimiter können ";" oder auch ",";sein';
  A := S.Split([';',','], '"', '"');
  Assert(Length(A) = 3);
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:20 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