AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein StringHelper Methode Split fehlerhaft?
Thema durchsuchen
Ansicht
Themen-Optionen

StringHelper Methode Split fehlerhaft?

Ein Thema von Kostas · begonnen am 19. Jun 2016 · letzter Beitrag vom 20. Jun 2016
Antwort Antwort
Seite 1 von 3  1 23      
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.058 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

StringHelper Methode Split fehlerhaft?

  Alt 19. Jun 2016, 13:22
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
  Mit Zitat antworten Zitat
Whookie

Registriert seit: 3. Mai 2006
Ort: Graz
441 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: StringHelper Methode Split fehlerhaft?

  Alt 19. Jun 2016, 15:22
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

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

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

Software isn't released ... it is allowed to escape!
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: StringHelper Methode Split fehlerhaft?

  Alt 19. Jun 2016, 15:36
Was sagt denn die Doku?

Da scheint wohl per Default TStringSlitOptions.ExcludeEmpty gesetzt zu sein. Aber es gibt ja ein overload wo man diese Option mit TStringSlitOptions.None übergeben kann.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (19. Jun 2016 um 15:40 Uhr)
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.058 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: StringHelper Methode Split fehlerhaft?

  Alt 19. Jun 2016, 15:57
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

Geändert von Kostas (19. Jun 2016 um 16:15 Uhr)
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.058 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: StringHelper Methode Split fehlerhaft?

  Alt 19. Jun 2016, 16:02
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.
Splited := r.Split([','],'"','"'); Gruß Kostas
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.058 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: StringHelper Methode Split fehlerhaft?

  Alt 19. Jun 2016, 16:26
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
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: StringHelper Methode Split fehlerhaft?

  Alt 19. Jun 2016, 16:34
Für das was du da machen möchtest ist 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 TStringList kann, indem du den 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).
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.058 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: StringHelper Methode Split fehlerhaft?

  Alt 19. Jun 2016, 16:46
Für das was du da machen möchtest ist 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
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: StringHelper Methode Split fehlerhaft?

  Alt 19. Jun 2016, 16:57
Delphi hat etwas integriert was das alles berücksichtigt und das schon bevor es die Helper gab und nennt sich TStringList
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.058 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: StringHelper Methode Split fehlerhaft?

  Alt 19. Jun 2016, 17:10
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:18 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