AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Explode-Funktion erweitern, um "a b c" zu ignorieren

Explode-Funktion erweitern, um "a b c" zu ignorieren

Ein Thema von DieDolly · begonnen am 2. Dez 2019 · letzter Beitrag vom 2. Dez 2019
Antwort Antwort
DieDolly

Registriert seit: 22. Jun 2018
1.259 Beiträge
 
#1

Explode-Funktion erweitern, um "a b c" zu ignorieren

  Alt 2. Dez 2019, 21:28
Ich benutze seit langer zeit diesen Code. Ich bevorzuge es mit Explode() zu wrappen. Nur deswegen dieser für manche umständliche Aufruf.
Darum gehts aber nicht.
Delphi-Quellcode:
function Explode(const Delimiter, Str: string): TArray<string>;
begin
 SetLength(Result, 0);
 Result := Str.Split([Delimiter]);
end;

Kann man Split() irgendwie dazu nutzen, damit in " gesetzte Wörter nicht getrennt werden?
Delphi-Quellcode:
a b c d
// ergibt ein Array mit Länge 4
Delphi-Quellcode:
a "b c" d
// soll ein Array mit Länge 3 ergeben
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
7.184 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Explode-Funktion erweitern, um "a b c" zu ignorieren

  Alt 2. Dez 2019, 22:43
Klar:
Delphi-Quellcode:

  Result := Str.Split([Delimiter], '"');
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
1.259 Beiträge
 
#3

AW: Explode-Funktion erweitern, um "a b c" zu ignorieren

  Alt 2. Dez 2019, 22:56
Wie kann ich daraus denn 2 überladene Funktionen machen, ohne einen Compilerfehler zu bekommen?

Delphi-Quellcode:
function Explode(const Delimiter, Str: string; QuoteChar: Char): TArray<string>;
begin
 SetLength(Result, 0);
 Result := Str.Split([Delimiter], QuoteChar);
end;

function Explode(const Delimiter, Str: string): TArray<string>;
begin
 Result := Explode(Delimiter, Str, ''); // compilerfehler hier, wenn '' dort steht.
end;
In der oberen Explode steht noch etwas mehr drin, weswegen ich diese natürlich am Ende von allen überladenen Funktionen auch aufrufen möchte
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
26.883 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Explode-Funktion erweitern, um "a b c" zu ignorieren

  Alt 2. Dez 2019, 23:00
Man kann eben einen Leerstring nicht als Zeichen übergeben, es muss schon ein Zeichen sein.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
1.259 Beiträge
 
#5

AW: Explode-Funktion erweitern, um "a b c" zu ignorieren

  Alt 2. Dez 2019, 23:03
Dann habe ich da ein kleines Designproblem was die überladenen Funktionen angeht.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
7.184 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: Explode-Funktion erweitern, um "a b c" zu ignorieren

  Alt 2. Dez 2019, 23:06
Na so in etwa:
Delphi-Quellcode:
function Explode(const Delimiter, Str: string; QuoteChar: Char): TArray<string>; overload;
begin
 Result := Str.Split([Delimiter], QuoteChar);
end;

function Explode(const Delimiter, Str: string): TArray<string>; overload;
begin
 Result := Str.Split([Delimiter]);
end;
Man kann die gequotete Version von Split nicht verwenden, wenn man keine Quotes hat. Deswegen gibt es da halt verschiedene Überladungen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
1.259 Beiträge
 
#7

AW: Explode-Funktion erweitern, um "a b c" zu ignorieren

  Alt 2. Dez 2019, 23:09
Na so in etwa:
Das Problem ist, dass ich danach noch etwas Code aufrufe. Meine Idee dazu lautet jetzt

Delphi-Quellcode:
function Base(const aArray: TArray<string>): TArray<string>;
begin
 Result := mach-was-mit-aArray; // keine sorge, gehört alles zum eigentlichen Explode-Algorithmus was hier passiert
end;

function Explode(const Delimiter, Str: string; QuoteChar: Char): TArray<string>;
begin
 Result := Base(Str.Split([Delimiter], QuoteChar));
end;

function Explode(const Delimiter, Str: string): TArray<string>;
begin
 Result := Base(Str.Split([Delimiter]));
end;
Funktioniert auch soweit

Zitat:
a "b c" d

a
"b
c"
d
Zitat:
a "b c" d

a
"b c"
d

Geändert von DieDolly ( 2. Dez 2019 um 23:13 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
7.184 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Explode-Funktion erweitern, um "a b c" zu ignorieren

  Alt 2. Dez 2019, 23:14
Das ist so vollkommen legitim

Da die beiden Explode-Overloads eigentlich nichts anderes sind, als Wrapper um den Split-Aufruf, könnte man die auch als inline Deklarieren. Dann spart man sich ein wenig Stack-Geschubse.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 14:54 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf