Semikolon maskieren?

Begonnen von ThomasDr, 20 Juli 2025, 08:59:47

Vorheriges Thema - Nächstes Thema

ThomasDr

Hallo,

Ich möchte mit einen notify eine csv Datei erstellen und ein Semikolon als Trennzeichen benutzen, habe aber noch keine Möglichkeit gefunden das Semikolon zu maskieren.
Mittlerweile benutze ich ein anderes Trennzeichen und würde einfach aus Interesse gerne wissen wie man das mit dem Semikolon macht.

Schöne Grüße
ThomasD

betateilchen

Poste doch mal den Code, den Du dafür verwendest.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

ThomasDr

#2
Hallo,

So funktionierte es nicht mit Semikolon:
my $trenner = ',';
my $zeitformat = strftime '%H:%M', localtime();
my $dateformat = strftime '%d-%m-%Y', localtime();
$csvline = $dateformat.$trenner.$zeitformat.$trenner.$daten;
system("echo $csvline >> /opt/fhem-log/daten.csv");

Chatgpt hat mir dann aber ein paar Lösungen vorgeschlagen, eine mit system und eine mit open, diese sollte eine bessere Wahl sein:
my $zeitformat = strftime '%H:%M', localtime();
my $dateformat = strftime '%d-%m-%Y', localtime();
my $trenner = ";";
$csvline = "$dateformat$trenner$zeitformat$trenner$daten\n";
open(my $fh, '>>', '/opt/fhem-log/daten.csv');
print $fh $csvline;
close($fh);

Schöne Grüße
ThomasD

betateilchen

Zitat von: ThomasDr am 20 Juli 2025, 10:47:21Chatgpt hat mir dann aber ein paar Lösungen vorgeschlagen

Manchmal kommt man mit menschlicher Intelligenz und FHEM-Bordmitteln schneller ans Ziel.

sub xx {
my $daten = "Testdaten";
my $out   = strftime('%d-%m-%Y;%H:%M;', localtime()).$daten;
FileWrite("/opt/fhem/log/daten.csv",$out);
}

liefert als Ergebnis in der Datei /opt/fhem/log/daten.csv:

20-07-2025;11:07;Testdaten
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Otto123

#4
Unabhängig von besseren Lösungen und so ganz allgemein für FHEM:
wenn der Code in der Kommandozeile von FHEM ausgeführt wird, bzw. so in der DEF steht, muss ein semikolon verdoppelt werden, damit es erhalten bleibt. Sonst wertet es FHEM als Befehlstrenner.

Beispiel analog zu Deinem Code:
{system("echo 'Satz ;; mit semikolon' >>test.txt")}ergibt
ZitatSatz ; mit semikolon
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

rudolfkoenig

Zitatsystem("echo $csvline >> /opt/fhem-log/daten.csv");
Wenn $csvline Semikolons enthaelt, dann sind das fuer den Shell (wg. system) mehrere Befehle.
Fix:
system("echo '$csvline' >> /opt/fhem-log/daten.csv");Abgesehen davon ist diese Loesung ineffizient, da ein Prozess gestartet wird, um eine Zeile zu schreiben.

ChatGPTs Vorschlag ist effizienter.
betateilchens auch, zusaetzlich "FHEM-Konform" wg. FileWrite, und wegen sub in 99_myUtils.pm besser pflegbar.

rudolfkoenig

Zitatwenn der Code in der Kommandozeile von FHEM ausgeführt wird, bzw. so in der DEF steht, muss ein semikolon verdoppelt werden, damit es erhalten bleibt. Sonst wertet es FHEM als Befehlstrenner.
Das ist richtig, wenn man fhem.cfg direkt editiert, oder die Modifikation in "Raw definition" im Detailansicht stattfindet.
Der Editor, was mit Click auf "DEF" geoeffnet wird, und per "modify XX" gespeichert wird, fuehrt die Strichpunkt-Doppelung automatisch durch.
Ja, ist etwas verwirrend. Einer der Gruende, warum man laengeren Code in 99_myUtils auslagern sollte.

betateilchen

Zitat von: rudolfkoenig am 20 Juli 2025, 11:25:31Wenn $csvline Semikolons enthaelt, dann sind das fuer den Shell (wg. system) mehrere Befehle.

Und das Ergebnis (Fehlermeldungen) sieht man auch schön, wenn man danach ins FHEM Log schaut - spaßeshalber hatte ich den Originalcode mit system() vorhin auch getestet. Da sieht man schön, dass auf der Shell die Semikolon verschwinden und der Text in drei Befehle aufgeteilt wird:

20-07-2025
sh: 1: 11:01: not found
sh: 1: Testdaten: not found
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

ThomasDr

Dann scheint mir die FileWrite Variante in fhem die beste zu sein, die Formatierung kann ich dann beibehalten.