In Zeichenkette Semikolon ersetzen

Begonnen von oniT, 09 Juni 2013, 17:19:41

Vorheriges Thema - Nächstes Thema

oniT

Hallo,

ich taste mich inzwischen recht weit vor, zumindest für meine Verhälnisse ;-) aber nun stehe ich an einem Punkt und habe keine Lösung.

Ich möchte in einer Zeichenkette alle Semikolon durch einem Punkt/Leerzeichen oder was auch immer ersetzen. Wenn ich mich nicht irre müsste dies doch so irgendwie gehen:

my $splitzeile =~ m/;/./;;\

Allerdings geht es ja nicht wegen dem Semikolon. Ich habe schon mehrere Varianten ausprobiert auch mit einem 2.Semikolon usw. usf. aber es geht irgendwie nicht. Würde mir hier bitte jemand helfen.

Danke

Gruß,
TinoB
BBB - debian weezy - FHEM 5.7
HMLAN - HM-LC-Bl1-FM, HM-ES-PMSw1-PI, HM-LC-Sw1-FM, HM-TC-IT-WM-W-EU, HM-WDS40-TH-I, HM-Sen-Wa-Od, HM-Sec-RHS
Dimplex Wärmepumpe / Dimplex ZL 300 - Modbus TCP
SDM630M - Modbus TCP
SolarLog 200 / SMA SonnyBoy 1.5/2.5 - Modbus TCP

UliM

=~ m  ist 'match' , das ersetzt gar nix.
=~ s   ist 'substitute' , damit schon probiert?
Steht das bei Dir in einem at/notify oder in ner Routine in zB 99_myUtils ?
Gruß Uli
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

oniT

Hi Uli,

ach ja, richtig. Ich bin durch die verschiedensten Versuche auch schon völlig durcheinander.

Damit hab ich es zum Beispiel auch schon versucht:

my $splitzeile =~ s/\;;/./;;\

Es steht in einem at/notify.

Gruß,
TinoB
BBB - debian weezy - FHEM 5.7
HMLAN - HM-LC-Bl1-FM, HM-ES-PMSw1-PI, HM-LC-Sw1-FM, HM-TC-IT-WM-W-EU, HM-WDS40-TH-I, HM-Sen-Wa-Od, HM-Sec-RHS
Dimplex Wärmepumpe / Dimplex ZL 300 - Modbus TCP
SDM630M - Modbus TCP
SolarLog 200 / SMA SonnyBoy 1.5/2.5 - Modbus TCP

Inhumierer

im sed müsste das so gehen: "s/;/ /g"

oniT

Hallo,

ja das "s/;/ /g" geht in einer Routine aber nicht in einem at/notify.

Von daher suche ich immer noch an einer Lösung.

Gruß,
TinoB
BBB - debian weezy - FHEM 5.7
HMLAN - HM-LC-Bl1-FM, HM-ES-PMSw1-PI, HM-LC-Sw1-FM, HM-TC-IT-WM-W-EU, HM-WDS40-TH-I, HM-Sen-Wa-Od, HM-Sec-RHS
Dimplex Wärmepumpe / Dimplex ZL 300 - Modbus TCP
SDM630M - Modbus TCP
SolarLog 200 / SMA SonnyBoy 1.5/2.5 - Modbus TCP

MisterEltako

Warum funktioniert das dort nicht? Poste doch Mal deine Codezeilen.

MfG,MisterEltako
HMLAN-Konfigurations-Adapter, HM-Funkjalousieaktor/HM-Dimmaktor/HM-Schaltaktor f. Markenschalter, Jalousie-/Schaltaktor von Eltako, FT4 v. Eltako, TCM310

oniT

Hallo,

ich nehme an, dass einigen hier diese Zeilen:

m[mi++]="07.05.13 15:20:00|78;119;8943;421;29"

bekannt vor kommen. Diese werden damit ausgelesen:


define SolarTest10 at +*00:05:00 {\
my @ret=GetHttpFile("ip-adresse", "/min_day.js");;\
my @value=split "\n",$ret[0];;\
my $zeile = "1";;\
my $auslesen = $zeile - 1;;\
my @splitzeile = @value[$auslesen];;\
my @splitzeile=substr "@splitzeile[0]",27;;\
my @splitzeile=split "(?=\").*",$splitzeile[0];;\
Log 1, "Test: @splitzeile";;\
}


Jetzt nicht lachen, ich weiß nicht ob das so richtig ist und kürzer geht es sicherlich auch, aber zumindest kommt schon einmal diese dabei heraus:

78;119;8943;421;29

Am Ende sollen alle 5 Werte einzeln, einem zum Beispiel dummy, zugeordnet werden.

Wenn ich nun diese Zeile einfüge:


my @splitzeile=split "s/"/ /g",$splitzeile[0];;\



define SolarTest10 at +*00:05:00 {\
my @ret=GetHttpFile("ip-adresse", "/min_day.js");;\
my @value=split "\n",$ret[0];;\
my $zeile = "1";;\
my $auslesen = $zeile - 1;;\
my @splitzeile = @value[$auslesen];;\
my @splitzeile=substr "@splitzeile[0]",27;;\
my @splitzeile=split "(?=\").*",$splitzeile[0];;\
my @splitzeile=split "s/;/ /g",$splitzeile[0];;\
Log 1, "Test: @splitzeile";;\
my @splitzeile=();;\
}


funktioniert es nicht. Das liegt halt an dem Semikolon. Es kommt dann bereits beim Speichern diese Meldung:

Unknown command /, try help

Danke
Gruß,
TinoB
BBB - debian weezy - FHEM 5.7
HMLAN - HM-LC-Bl1-FM, HM-ES-PMSw1-PI, HM-LC-Sw1-FM, HM-TC-IT-WM-W-EU, HM-WDS40-TH-I, HM-Sen-Wa-Od, HM-Sec-RHS
Dimplex Wärmepumpe / Dimplex ZL 300 - Modbus TCP
SDM630M - Modbus TCP
SolarLog 200 / SMA SonnyBoy 1.5/2.5 - Modbus TCP

MisterEltako

Das ist glaube ich so nicht lösbar, eventuell rufst du eine Funktion auf die dir dann den Wert zu Weiterverarbeitung zurückgibt.


so in der Art in der 99_Utils.pm:
sub Trenner($){
my $Teststring = shift;
$Teststring =~ s/\;//g;
return $Teststring;
}

und dann in deiner Definition als Funktion aufrufen.

MfG, MisterEltako
HMLAN-Konfigurations-Adapter, HM-Funkjalousieaktor/HM-Dimmaktor/HM-Schaltaktor f. Markenschalter, Jalousie-/Schaltaktor von Eltako, FT4 v. Eltako, TCM310

UliM

Hi,
mehrere seltasame Dinge:
Du definierst @splitzeile durch das vorangestellte my jedes mal neu.
Ist das so gewollt?
Das müsste doch Fehlermeldungen geben?

substr "@splitzeile[0]",27
funktioniert? Das müsste doch
substr "$splitzeile[0]",27
heissen?

Auf den Gedanken, in der regexp eines split gleich eine Ersetzung vorzunehmen, bin ich noch nie gekommen. Wenn Du nach ';' splittest, fällt das Trennzeichen ja eh raus.
Schon versucht mit
@splitzeile = split(';',$splitzeile);
?

Kannst Du mal posten, welchen Wert zu Anfang $ret[0] hat? Steht da drin:
m[mi++]="07.05.13 15:20:00|78;119;8943;421;29"
?

Falls ja, würd ich mal versuchen
my $val = $ret[0];
$val =~ s/.*\|(.*)\".*/$1/;    # nur den Teil zwischen | und dem hinteren Anführungszeichen
my @values = split(';',$val):  # splitten nach Semikolon

Ungetestet. Kannst ja erstmal probieren mit http://regexp-tester.mediacix.de/exp/regex/

=8-)
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

oniT

Hallo Uli,


ZitatHi,
mehrere seltasame Dinge:
Du definierst @splitzeile durch das vorangestellte my jedes mal neu.
Ist das so gewollt?
Das müsste doch Fehlermeldungen geben?
Ja das funktioniert.

Zitatsubstr "@splitzeile[0]",27
funktioniert?
ja, das funktioniert auch ohne Problem.

ZitatDas müsste doch
substr "$splitzeile[0]",27
heissen?
ja, das funktioniert auch.

ZitatAuf den Gedanken, in der regexp eines split gleich eine Ersetzung vorzunehmen, bin ich noch nie gekommen. Wenn Du nach ';' splittest, fällt das Trennzeichen ja eh raus.
Schon versucht mit
@splitzeile = split(';',$splitzeile);
funktioniert nicht.

ZitatKannst Du mal posten, welchen Wert zu Anfang $ret[0] hat? Steht da drin:
m[mi++]="07.05.13 15:20:00|78;119;8943;421;29"
ja, das ist der Wert.

ZitatFalls ja, würd ich mal versuchen
my $val = $ret[0];
$val =~ s/.*\|(.*)\".*/$1/;    # nur den Teil zwischen | und dem hinteren Anführungszeichen
my @values = split(';',$val):  # splitten nach Semikolon
Nein, das geht nicht. Da kommt diese Fehlermeldung.

Unknown command ',$val);\

ZitatUngetestet. Kannst ja erstmal probieren mit http://regexp-tester.mediacix.de/exp/regex/
ja, damit hatte ich den Split auch schon getestet, sobald jedoch ein Backslash oder Semikolon kommt, wird diese Meldung angezeigt:

Im Suchmuster ist ein Delimiter enthalten. Dieser muss mit einen Backslash \ maskiert werden. Oder setze die Option preg_quote()

Gruß,
TinoB
BBB - debian weezy - FHEM 5.7
HMLAN - HM-LC-Bl1-FM, HM-ES-PMSw1-PI, HM-LC-Sw1-FM, HM-TC-IT-WM-W-EU, HM-WDS40-TH-I, HM-Sen-Wa-Od, HM-Sec-RHS
Dimplex Wärmepumpe / Dimplex ZL 300 - Modbus TCP
SDM630M - Modbus TCP
SolarLog 200 / SMA SonnyBoy 1.5/2.5 - Modbus TCP