ExtractDelimited mit variablem Trenner

Rund um die LCL und andere Komponenten
Antworten
Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

ExtractDelimited mit variablem Trenner

Beitrag von Timm Thaler »

Ich möchte einen String aus Messwerten '123,456,789' mit ExtractDelimited (https://www.freepascal.org/docs-html/rtl/strutils/extractdelimited.html) auseinandernehmen.

Der Trenner kann dabei variabel sein, je nach Quelle ';' ',' oder anders, steht aber beim Kompilieren nicht fest. Mit ExtractDelimited(k, data, [tsep]) kann ich aber nur konstante Trenner setzen.

Gibt es eine Möglichkeit, an dieser Stelle variable Trenner anzugeben, die ich nicht sehe?

Um das klarzustellen, ich will nicht alle möglichen Trenner mit [',', '.', ';', ':'] angeben. Ich will genau einen Trenner angeben, aber der kann je nach Datenquelle unterschiedlich sein.

Workaround wäre, mit einem festen Trenner in ExtractDelimited zu arbeiten und vorher den variablen Trenner im Datenstring durch diesen zu ersetzen.

Benutzeravatar
Ally
Beiträge: 263
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

Re: ExtractDelimited mit variablem Trenner

Beitrag von Ally »

Hallo Timm Thaler,

vielleicht hilft dir da Split weiter.

Code: Alles auswählen

var
  Zeile: String;
  Trenner: String;
  Werte: TStringArray;
.
.
.
  Zeile := '123,456,789';
  Trenner := ',';
 
  // String in seine Einzelteile zerlegen
  Werte := Zeile.Split(Trenner);
 
  // Werte verwenden
  ErsterWert := Werte[0];
  ZweiterWert := Werte[1];
  DritterWert := Werte[2];
.
.
 


Gruß Roland

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: ExtractDelimited mit variablem Trenner

Beitrag von wp_xyz »

Wieso soll das nicht funktionieren? Bloß weil die Delimiter als "const" in der Funktion deklariert sind, heißt nicht, dass sie auch im Programm "const" sein müssen. "const" heißt bei einer Prozedur/Funktion lediglich, dass der Parameter innerhalb der Funktion nicht verändert werden kann.

Der folgende Code funktioniert bei mir zumindest:

Code: Alles auswählen

var
  KannAuchStrichpunktSein: Boolean = true;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  s: String;
  delim: TSysCharset;
begin
  s := 'eins, zwei; drei,vier,fünf';
  delim := [','];
  if KannAuchStrichpunktSein then delim := delim + [';'];
  Caption := '"' + ExtractDelimited(2, s, delim) + '"';
end;

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: ExtractDelimited mit variablem Trenner

Beitrag von Timm Thaler »

wp_xyz hat geschrieben:Der folgende Code funktioniert bei mir zumindest:


Das ist aber nicht, was ich will, ind den [] stehen ja wieder Konstanten.

Es funktioniert aber trotzdem mit ExtractDelimited(k, data, [tsep]), nur darf tsep kein String, sondern muss ein Char sein. Die Fehlermeldung "Illegal Expression" an der Stelle ist etwas nichtssagend.

Antworten