Stand back – I know CMD!

Ich merke das schon, Psychologie läuft nicht so gut wie Programmierung und Politik…

gnuplot hält sich für ein sehr gutes Diagramm-Plot-Programm – und das stimmt meistens auch. Wenn es darum geht, Daten aus Dateien einzulesen wird das Skript zwar sehr schnell sehr hässlich, aber es funktioniert. Zumindest, wenn man die Daten vorkocht, denn filtern kann man sie in gnuplot selbst nicht mehr vernünftig. Das ist aber grade dann von Nöten, wenn man lange Messreihen hat, aber zum Beispiel nur an den letzten N Messwerten interessiert ist. Eigentlich doch ein nicht grade seltenes Problem, aber fertige Lösungen jenseits von `tail -n` sind nicht wirklich auffindbar.

Noch wesentlich haariger wird das Thema, sobald man einen Zeitstempel drin hat. Nun ist zwar gnuplot per

set xdata time
set timefmt "%s"

sehr gut in der Lage das zu lesen und richtig darzustellen, aber irgendwas damit anfangen kann man nicht.

Hier muss also ein separates Programm her… und weil ein Programm da vielleicht etwas Overkill wäre, können wir doch das auch mit Shell-Foo (Wie heißt das auf Windows? cmd-foo?) lösen, oder? Klar können wir das 😉

@echo off
setlocal
set show_last_seconds=43200
set tmx=
set tmi=
for /F "usebackq delims=;" %%i in (`tail -n 1 values.log`) do set tmx=%%i
set /a tmi=tmx-show_last_seconds
del akku.csv >nul 2>nul
for /F "tokens=1* delims=;" %%i in (values.log) do (
  if /I %%i GTR %tmi% (
    echo %%i;%%j>>akku.csv
  )
)
..binwgnuplot akku.plt
start akku.png

Kurzerklärung: das Skript sucht sich zuerst die letzte Zeile. Da cmd.exe nicht anders Strings parsen kann, muss hier for ran – eine Schleife über genau einen CSV-Datensatz. Davon wird dann die anzuzeigende Zeit subtrahiert (hier 4 Stunden) und in Folge alle Sätze der Quelldatei geprüft, ob sie neuer sind als diese Grenzzeit. Tun das, gehts ab in die gefilterte Datei, die ein einfaches gnuplot-Skript zur Grafik macht.

(Referenz im Titel)

2 thoughts on “Stand back – I know CMD!

  1. Das sieht wirklich grausam aus. 🙂
    Wenn du schon GNU-Software unter Windows benutzt, dann kannst du auch gleich noch eine vernünftige Shell dazuwerfen. Oder gleich einen Perl-Interpreter… dann darfst du auch Regexe benutzen. :p

  2. Das ist aber alles so furchtbar fies einzurichten, weil die Integration in die Umgebung je nach Art (MinGW ist mir ja lieber) sehr verkrampft ist. Dann doch lieber was durchgehendes…

    Theoretisch hätte ich auch awk nehmen können.

    Aber das sähe weit weniger cool aus.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.