RegExp (Regulärer Ausdruck) Zahl nach Anzahl an bestimmten Ausdruck

Harald654

Cadet 2nd Year
Registriert
Feb. 2014
Beiträge
21
Hallo,
ich versuch mit RegExp eine Textdatei zu filter.
Der Text besteht aus mehreren Messwerten und ich will nur den Wert nach dem 11. Komma anzeigen.
Beispiel:
Code:
time,model,id,channel,battery,temperature_F,humidity
2016-09-19 15:07:19,Bresser 3CH sensor,50,1,OK,73.200,48
Ich würde nun gerne mit RegExp nur die Zahl "73.200" ausgeben.


Edit: noch besser wäre es wenn ich direkt:
- model (Bresser 3CH sensor)
- id (50)
- Chanel (1)
- battery (OK)
- temperature (73.200,48)
- humidity (48)
ausgeben könnten.

Mit "(\,\S\,(\S+)\,(\S+))\,(\S+)" bin ich zumindest schon mal so weit das ich battery, temperature und humidity ausgeben kann.
Ich probier schon ganzen Abend mit http://www.regexe.de/ rum, aber ich bekomme es einfach nicht hin....
Kann mir jemand helfen?
 
Muss es unbedingt RegEx sein?
Viele Sprachen bieten eine split funktion für Stings an..
Das würde die Sache viel einfacher machen.
 
Ich kann dir https://regex101.com/ empfehlen..

Ich versuche mich mal an deiner Aufgabe.
Sind das auch wirklich 2 Zeilen? Kannst du noch eine etwas größere Messung (mit mehr Werten) hergeben?

Code:
(\d+-\d+-\d+)\s(\d+:\d+:\d+),(.+?),(\d+),(\d+),(\w+),([0-9.]+),(\d+)
War nicht wirklich schwer, optional könnte man die Gruppen noch benennen.

Edit:

Das wäre dann so:
Code:
(?<date>\d+-\d+-\d+)\s(?<time>\d+:\d+:\d+),(?<model>.+?),(?<id>\d+),(?<channel>\d+),(?<battery>\w+),(?<temp>[0-9.]+),(?<humidity>\d+)


Unbenannt.png

Edit: hier noch leicht vereinfacht (date und time):
Code:
(?<date>[\d-]+)\s(?<time>[\d:]+),(?<model>.+?),(?<id>\d+),(?<channel>\d+),(?<battery>\w+),(?<temp>[0-9.]+),(?<humidity>\d+)
 
Zuletzt bearbeitet:
Wenn das ohnehin immer das gleiche Format hat und die Anzahl der Gruppen hardcoded wird, kann man auch einfach immer (.*), wiederholen.

Aber eigentlich nimmt man für sowas split().
 
wow, das ging aber schnell, vielen vielen Dank!
@Banbag, genau das hab ich gesucht, perfekt! :)

Die Messung bzw. Datei enthält immer nur 1 Messung (ist für ein kleines Projet mit meinem RPI, mit jeder neuen Messung wir die Datei überschrieben).
Besser wäre es natürlich wenn ich neue Messwerte einfach anhängen könnte und dann mit RegExp jeweils die letzte Zeile auswerten könnte.
Also egal ob 4 Zielen in der Datei:
Code:
time,model,id,channel,battery,temperature_F,humidity
2016-09-19 21:53:55,Bresser 3CH sensor,50,1,OK,73.800,45
2016-09-19 21:54:52,Bresser 3CH sensor,50,1,OK,73.800,45
2016-09-19 21:55:50,Bresser 3CH sensor,50,1,OK,73.800,45
oder mehr, z.B. 5:
Code:
time,model,id,channel,battery,temperature_F,humidity
2016-09-19 21:53:55,Bresser 3CH sensor,50,1,OK,73.800,45
2016-09-19 21:54:52,Bresser 3CH sensor,50,1,OK,73.800,45
2016-09-19 21:55:50,Bresser 3CH sensor,50,1,OK,73.800,45
2016-09-19 21:56:46,Bresser 3CH sensor,50,1,OK,73.800,45
2016-09-19 21:57:43,Bresser 3CH sensor,50,1,OK,73.800,45

ich bräuchte immer die Auswertung der letzten Zeile (ich ging davon aus, dass dies mit RegExp nicht möglich ist, darum überschreibe ich die Datei mit jedem neuen Messwert)

PS: ich bin leider auf RegExp begrenzt, was anderes kann meine Visualisierung-Programm nicht.

Gruß,
 
Zuletzt bearbeitet:
Das ist auch einfach:

Code:
(?<date>[\d-]+)\s(?<time>[\d:]+),(?<model>.+?),(?<id>\d+),(?<channel>\d+),(?<battery>\w+),(?<temp>[0-9.]+),(?<humidity>\d+)$
(betrachte das $ zum Schluss) (hier gibt es noch einige andere möglichkeiten, z.B. mit der option singleline und dann am Anfang .* einfügen)

Alternativ könnte man auch alle Zeilen matchen und dann einfach nur die letzte Gruppe auswerten..
So könntest du z.B. eine Statistik erstellen (wenn du alle auswertest..).

Unbenannt.png

Merke: Es gibt nichts, was du nicht mit RegEx erreichen kannst.


Edit²:

Falls es für dich von Relevanz ist: Der Ausdruck oben braucht 5437 Schritte um zum Ergebnis zu kommen

Code:
.*\n(?<date>[\d-]+)\s(?<time>[\d:]+),(?<model>.+?),(?<id>\d+),(?<channel>\d+),(?<battery>\w+),(?<temp>[0-9.]+),(?<humidity>\d+)$
mit der Option "singleline" braucht nur 126 - ist also um ein großes vielfaches schneller.
 
Zuletzt bearbeitet:
Das wird ja immer besser :D
@Bangbag, vielen Dank!
Ich hab mich heute Abend min. ne Stunde in RegEx eingelesen, aber ich komm damit einfach nicht klar...

Edit: mir fällt gerade ein, weißt du wie RegEx bei deinem Letzten Code vorgeht? Ich nehm an RegEx durchforstet die Datei von Anfan-->Ende? Das könnte bei einer großen Datei (z.B. Messwerte jede Minute über 2 Wochen) für den RPi mit seiner begrenzten Rechenleistung ein Problem werden, da die Datei für de Visualisierung alle 10 sek. mit RegEx ausgelesen wird. Optimal wäre es wenn RedEx am Ende der Datei anfangen würde zu suchen.
 
Siehe Edit² :D
 
Harald654 schrieb:
Ich hab mich heute Abend min. ne Stunde in RegEx eingelesen, aber ich komm damit einfach nicht klar...
Ja, am Anfang kam ich damit auch nicht so ganz klar, aber wenn man es einige male genutzt hat, ist es ganz einfach. Und viel besser als Einlesen ist Ausprobieren!

PS: Mein Name ist Bagbag :o
 
character schrieb:
Oha, da hat aber jemand in theoretischer Informatik nicht richtig aufgepasst.
Ich hatte noch nie Informatik, wird an meiner Schule leider nicht angeboten.

Aber ja, sicher gibt es irgendwo Grenzen mit RegEx, aber so gut wie immer kommt man damit ans Ziel - wenn es auch manchmal ganz schön tricky wird.
 
Das sieht doch aus wie ne CSV - Wieso zum Geier nimmt man also RegEx dafür?
CSV parsen in ein Array, letztes Element (= letzte Zeile), davon dann den vorletzten Wert benutzen.

Ist vermutlich schneller, schöner und einfacher als RegEx.

Da du einen regulären Ausdruck verwenden möchtest, deine Sprache das also schon kann, wird sie sicher auch einen CSV-Parser an Board haben (Java s. https://www.mkyong.com/java/how-to-read-and-parse-csv-file-in-java/ über split selbstimplementiert, PHP s. https://secure.php.net/manual/de/function.str-getcsv.php, etc.).
 
@CryNickSystems
Das ist leider vorgegeben, ich trag das nur in ne Schnittstelle/Config für meine Visualisierung (RPi-Monitor) ein. Dort kann nur der Pfad und RegEx-Ausdruck gegeben werden.
 
Zurück
Oben