Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   StringHelper Methode Split fehlerhaft? (https://www.delphipraxis.net/189498-stringhelper-methode-split-fehlerhaft.html)

Kostas 19. Jun 2016 13:22

StringHelper Methode Split fehlerhaft?
 
Hallo Zusammen,

hat jemand eine Erklärung dafür warum die Split Methode ein ArrayItem weniger hat wenn das letzte Element leer ist?
Wenn ich Feld1-Feld4 jeweils mit einem String befülle und die Länge abfrage bekomme den richtigen Wert Length(splited) = 4.
Ist das letzte Feld4 jedoch leer, ist Length(splited) = 3. Das kann doch nicht sein oder?

Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var s:string;
    splited:TArray<String>;
    Feld1,Feld2,Feld3,Feld4:string;
begin
  Feld1 := 'F1';
  Feld2 := 'F2';
  Feld3 := 'F3';
  Feld4 := 'F4';
//  Feld4 := '';

  s := s.Join(',',[Feld1,Feld2,Feld3,Feld4]);
  splited := s.Split([',']);
  ShowMessage(Length(splited).ToString());
end;
Gruß Kostas

Whookie 19. Jun 2016 15:22

AW: StringHelper Methode Split fehlerhaft?
 
Sieht so aus als wäre das wirklich ein Problem in TStringHelper.IndexOfAny() bzw. TStringHelper.InternalSplit zu sein und gehört wohl ins QC.

Ein Workaround für dich wäre momentan

Delphi-Quellcode:
  s := s.Join(',',[Feld1,Feld2,Feld3,Feld4])+',';


das muss natürlich entfernt werden wenn es einen fix gibt.

Sir Rufo 19. Jun 2016 15:36

AW: StringHelper Methode Split fehlerhaft?
 
Was sagt denn die Doku?

Da scheint wohl per Default
Delphi-Quellcode:
TStringSlitOptions.ExcludeEmpty
gesetzt zu sein. Aber es gibt ja ein overload wo man diese Option mit
Delphi-Quellcode:
TStringSlitOptions.None
übergeben kann.

Kostas 19. Jun 2016 15:57

AW: StringHelper Methode Split fehlerhaft?
 
Hallo Sir Rufo,

habe ich ausprobiert. bei None (default) kommt genau das raus wie bei mir.
Bei ExcludeEmpty werden alle leeren Felder entfernt. Das ist noch viel schlimmer da sich die Anzahl der Felder permanent ändern würde.



Gruß Kostas

Kostas 19. Jun 2016 16:02

AW: StringHelper Methode Split fehlerhaft?
 
Hallo Whookie,

das ist keine Option wie ich finde. Ich schreibe ein csv File raus welches Fremdsystem lesen sollen. Ich kann also nicht einfach ein weiteres Feld hinzufügen um nur das letzt Feld zu exportieren.
Kann es wirklich sein dass es ein Bug ist?

Und noch eins:
Eigentlich hätte ich erwartet wenn ich beim Split die Start- und Ende Quote angebe, dass beim Spliten die Quote nicht dabei sind oder zumindest Einstellbar ist. Das ist nicht der Fall, sie werden immer exportiert.
Delphi-Quellcode:
Splited := r.Split([','],'"','"');
Gruß Kostas

Kostas 19. Jun 2016 16:26

AW: StringHelper Methode Split fehlerhaft?
 
Hallo Zusammen,
es kommt noch schlimmer:

ich habe in einem Feldinhalt das: (§§") also Quote ich das Feld zu "(§§")"
Split erkennt das nicht sauber wenn ich Start und Ende Quote char angebe.

Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var s,n:string;
    splited:TArray<String>;
    Feld1,Feld2,Feld3,Feld4:string;
begin
  Feld1 := 'F1';
  Feld2 := 'F2';
  Feld3 := '"(§§")"';
  Feld4 := 'F4';

  s := s.Join(',',[Feld1,Feld2,Feld3,Feld4]);
  splited := s.Split([','],'"','"');

  for n in splited do
  begin
    meDSBZMIVerein.Lines.Add(n);
  end;

//  ShowMessage(Length(splited).ToString());
end;
Das Ergebnis
F1
F2
"(§§")",F4

Also nur drei items!


Gruß Kostas

Sir Rufo 19. Jun 2016 16:34

AW: StringHelper Methode Split fehlerhaft?
 
Für das was du da machen möchtest ist
Delphi-Quellcode:
String.Split
in keinster Weise die richtige Wahl. Damit wird ein String stumpf an den Delimitern getrennt. Das ist die Aufgabe von dieser Methode.

Was du suchst ist das, was
Delphi-Quellcode:
TStringList
kann, indem du den
Delphi-Quellcode:
DelimitedText
zuweist. Es gibt noch die ein oder andere Eigenschaft, mit der du das Verhalten beeinflussen kannst (QuoteChar, Delimiter, StrictDelimiter).

Hier wird dann auch die Struktur berücksichtigt (das was du suchst).

Kostas 19. Jun 2016 16:46

AW: StringHelper Methode Split fehlerhaft?
 
Zitat:

Zitat von Sir Rufo (Beitrag 1340554)
Für das was du da machen möchtest ist
Delphi-Quellcode:
String.Split
in keinster Weise die richtige Wahl. Damit wird ein String stumpf an den Delimitern getrennt. Das ist die Aufgabe von dieser Methode....

Das ist der richtige Hinweis! Die Methode Split ist nicht dafür geeignet. Ich habe seit Delphi5 eine eigene Methode die das alles berücksichtigt. Ich dachte die kann ich vergessen wenn Delphi das jetzt integriert hat.

Dankeschön.
Gruß Kostas

Sir Rufo 19. Jun 2016 16:57

AW: StringHelper Methode Split fehlerhaft?
 
Delphi hat etwas integriert was das alles berücksichtigt und das schon bevor es die Helper gab und nennt sich
Delphi-Quellcode:
TStringList

Kostas 19. Jun 2016 17:10

AW: StringHelper Methode Split fehlerhaft?
 
Hallo Sir Rufo,


in der Doku zu DeQuotedString eindeutig dass das übergebene Quote char am Anfang und am Ende entfernt wird.
In meinem Beispiel entfernt er alle.

Delphi-Quellcode:
Feld3 := '"(§§")"';

memo.Lines.Add(Feld3.DeQuotedString('"'));

ergibt: (§§) anstelle von (§§")
Hast du eine Idee warum?

Gruß Kostas


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:38 Uhr.
Seite 1 von 3  1 23      

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