FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: oniT am 09 Juni 2013, 17:19:41

Titel: In Zeichenkette Semikolon ersetzen
Beitrag von: oniT am 09 Juni 2013, 17:19:41
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
Titel: Aw: In Zeichenkette Semikolon ersetzen
Beitrag von: UliM am 09 Juni 2013, 17:27:12
=~ 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
Titel: Aw: In Zeichenkette Semikolon ersetzen
Beitrag von: oniT am 09 Juni 2013, 17:42:12
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
Titel: Aw: In Zeichenkette Semikolon ersetzen
Beitrag von: Inhumierer am 09 Juni 2013, 20:24:53
im sed müsste das so gehen: "s/;/ /g"
Titel: Aw: In Zeichenkette Semikolon ersetzen
Beitrag von: oniT am 10 Juni 2013, 19:28:14
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
Titel: Aw: In Zeichenkette Semikolon ersetzen
Beitrag von: MisterEltako am 10 Juni 2013, 22:59:29
Warum funktioniert das dort nicht? Poste doch Mal deine Codezeilen.

MfG,MisterEltako
Titel: Aw: In Zeichenkette Semikolon ersetzen
Beitrag von: oniT am 11 Juni 2013, 19:36:34
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
Titel: Aw: In Zeichenkette Semikolon ersetzen
Beitrag von: MisterEltako am 11 Juni 2013, 20:57:18
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
Titel: Aw: In Zeichenkette Semikolon ersetzen
Beitrag von: UliM am 11 Juni 2013, 21:03:34
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/ (//regexp-tester.mediacix.de/exp/regex/)

=8-)
Titel: Aw: In Zeichenkette Semikolon ersetzen
Beitrag von: oniT am 11 Juni 2013, 22:24:03
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/ (//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