JSON Tabelle aus *.csv erstellen

meph!sto

Urgestein
Thread Starter
Mitglied seit
13.05.2008
Beiträge
2.479
Ort
MZ
Hi,
vorab eine kurze Erklärung was ich vorhabe:
Meine Raspberry Pi 3b+'s (Raspbian) pollen mittels Bluetooth meine Xiaomi Hygrometer und schreiben die Ergebnisse (Batteryzustand, Raumtemperatur und Luftfeuchtigkeit) in eine *.csv Datei.
Dafür habe ich funktionierende Shell-Skripte geschrieben, die auch wunderbar funktionieren.
Am Ende erhalte ich eine Datei
Code:
SUMMARY_LOG.csv
mit folgenden Einträgen
Code:
ROOM,BATTERY,TEMP,HUMID,DATE,TIME
Office,100,19.3,47.3,10.02.2019,14:40:00
Balcony,100,9.3,77.3,10.02.2019,14:40:00

Jetzt kommt mein eigentliches Problem:
Auf meinem MagicMirror sollen letztendlich die aktuellsten Temperaturen etc der einzelnen Sensoren tabellarisch aufgeführt werden.
Hierzu gibts bereits ein fertiges Modul GitHub - timdows/MMM-JsonTable: A module for the MagicMirror project which creates a table filled with a list gathered from a json request..
Das Modul erwartet die Daten (sofern ich es richtig verstanden habe), als JSON-Array.
Bsp (s. link).
Code:
{
    "currentUsages": [
        {
            "deviceName": "P1",
            "currentWattValue": 180,
            "todayKwhUsage": 5.902,
            "lastUpdate": "2018-04-02T18:12:06Z"
        },
        {
            "deviceName": "Studie - MainDown",
            "currentWattValue": 76,
            "todayKwhUsage": 0.46,
            "lastUpdate": "2018-04-02T18:06:52Z"
        },
        {
            "deviceName": "BoilerPower",
            "currentWattValue": 0,
            "todayKwhUsage": 2.21,
            "lastUpdate": "2018-04-02T17:30:01Z"
        },
        {
            "deviceName": "Koelkast",
            "currentWattValue": 1.3,
            "todayKwhUsage": 0.55,
            "lastUpdate": "2018-04-02T18:09:55Z"
        },
        {
            "deviceName": "Vaatwasser",
            "currentWattValue": 0.5,
            "todayKwhUsage": 0.01,
            "lastUpdate": "2018-04-02T18:10:51Z"
        },
        {
            "deviceName": "Wasmachine",
            "currentWattValue": 0,
            "todayKwhUsage": 0,
            "lastUpdate": "2018-04-02T18:12:06Z"
        }
    ]
}
Ich verstehe von JavaScript 0, gar nichts, nada.
Daher habe ich die Hoffnung dass ich einfach mit einem Bash-Skript die Daten aus meiner SUMMARY_LOG.csv in die o.g. Form schreiben kann.
Könnt ihr da helfen, da ich auch von Shell-Skripting ebenfalls nur rudimentäre Skills besitze.

Den Tip nach Bash+CSV+JSON zu google'n gaben mir die Profis im CBase-Forum bereits, also könnt ihr getrost darauf verzichten.
Hätte ich eine Lösung bereits ergooglen können, hätte ich keinen Grund nachzufragen.

Hat jmd. bereits Erfahrung mit jq ?

Danke
ein ahnungsloser
 
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
Wenn das was mit JavaScript zu tun hat, dann kann ich dir nur soviel sagen: ich weiß es nicht.
Da ich aber zur Zeit auch nicht zu Hause bin, kann ich erst später nachschauen (wie finde ich das heraus?).
Die MagicMirror Module haben alle eine "node_helper.js", falls das von Interesse ist.
 
node ist eine javascript runtime die du dann in deiner Shell/Terminal aufrufst. JSON ist halt ein Format, das sich besonders leicht mit Javascript verarbeiten lässt. Und entsprechende Pakete um CSV zu parsen gibt es, dann ist das eine Sache von ein paar Zeilen Code.
 
Ganz spontan würde ich das mit einem kleinen Python-Programm machen.
CSV in einen pandas dataframe laden, dataframe umformen , dann über dataframe to json wieder in einen Datei schreiben.
 
Danke schonmal,
ich weiß warum ich Forumbase nicht mag :fresse:

Und es wäre einfacher mit ein paar Zeilen JavaScript zu hantieren, als sich mit Shell-Geskripte herumzuschlagen ?
Kann ich die CSV innerhalb einer Shell mittels JavaScript ausführen ?
Ganz praktisch gesprochen: kann ich innerhalb meines Shell-Skripts auch JavaScript ausführen ? Die gleiche Frage bezieht sich natürlich auch auf Python.
 
Zuletzt bearbeitet:
Für Python geht das ohne Probleme. Du machst es ausführbar mit chmod, dann kannst du es wie eine Shell-Skript starten.
Oder du rufst den Python interpreter auf und übergibst das Skript "python meinProg.py". Ganz wie du möchtest.
 
Ich habe so langsam die Befürchtung dass ich doch entweder Python oder JavaScript nutzen sollte.
Wollte es eigentlich vermeiden, mich mit einer weiteren Sprache befassen zu müssen :d
 
Oder du findest jemanden der dir das in einem bash script zusammen hackt. Da bin ich dann aber raus :fresse:

Und ja, auch die JS Skripte rufst du mit node auf der shell auf.
 
Aber mit JS und/oder Python kann ich mich an euch wenden ? :love:
 
Hi,

hier mal eine quick and dirty Variante in der shell mit Hilfe von awk:
Code:
echo -e "{\n\t\"currentUsages\": [" 
awk -F "," -v printed=0 '{if (NR > 1) {if (printed == 0) {printed = 1} else {printf ",\n"}; printf "\t\t{\n\t\t\t\"room\": \"%s\",\n\t\t\t\"battery\": %s,\n\t\t\t\"temp\": %s,\n\t\t\t\"humid\": %s,\n\t\t\t\"date\": %s,\n\t\t\t\"time\": %s\n\t\t}", $1, $2, $3, $4, $5, $6}} END {printf "\n"}' SUMMARY_LOG.csv
echo -e "\t]\n}"

Sieht bei mir dann wie folgt aus:
Code:
/tmp# ./script.sh
{
        "currentUsages": [
                {
                        "room": "Office",
                        "battery": 100,
                        "temp": 19.3,
                        "humid": 47.3,
                        "date": 10.02.2019,
                        "time": 14:40:00
                },
                {
                        "room": "Balcony",
                        "battery": 100,
                        "temp": 9.3,
                        "humid": 77.3,
                        "date": 10.02.2019,
                        "time": 14:40:00
                }
        ]
}
 
:love:
Ihr seid stark. Ich probier das heute Abend mal aus und melde mich.
Danke aus Mainz nach Mainz :fresse:
 
Zuletzt bearbeitet:
Daher "quick and dirty".
Man könnte nun natürlich ein paar Zeilenumbrüche einbauen um das ganze ein wenig übersichtlicher zu machen. Wird die JSON-Datei anschließend automatisiert verarbeitet, dann kann man sich auch die ganzen \n und \t sparen. Macht das Skript ein wenig übersichtlicher, dafür kann man die Ausgabe nicht mehr lesen :rolleyes:
Die echos könnten auch noch mit in das awk in den BEGIN- und END-Block wandern usw. Ich erhebe keinen Anspruch darauf die schönste und/oder schnellste Variante erstellt zu haben, aber funktionieren müsste sie (sofern ich nicht irgendwo in der Ausgabe doch noch ein Komma oder ähnliches vergessen habe).

Eine Sprache die entsprechende Bibliotheken für csv und json mitbringt wäre bestimmt schöner, diese Bibliotheken kenne ich aber nicht aus dem Kopf.
Daher diese Variante :d
 
ES KLAPPT !

Musste nur dein Script ein kleinwenig anpassen.

Danke !
 
Zuletzt bearbeitet:
Google, "csv 2 json", erstes Ergebnis:

CSV to JSON - CSVJSON

Tut soweit ich das sehe genau was du willst.

Dort ist auch ein Link auf ein NPM-Package, falls es offline und per Shell funktionieren muss. Vielleicht hilft das ja vielleicht auch einem deiner Skriptschreiber hier. ;)
 
Zuletzt bearbeitet:
Freut mich wenn es funktioniert!
Wie gesagt gibt es wie immer viele Wege die zum Ziel führen. Bei einem größeren Projekt würde ich mich nach Alternativen umschauen.
Tut es aber was es soll und ich fasse es die nächste Zeit wahrscheinlich nicht mehr an, dann würde ich mir persönlich mit solch einem zugegeben hässlichen, aber schnell erstelltem Skript helfen :)
 
Was ich halt 0 verstehe: ich musste nur das Feld "Time" in "" setzen, dann gings.
Also statt 19:30:10, "19:30:10".

Aber egal, bin glücklich wie ein Honigkuchenpferd.

Danke an alle !
 
For completion, hier das Gleiche nochmal in Python:

Code:
#!/usr/bin/env python3

import csv
import fileinput
import json
import sys

def main():
    current_usages = []

    for line in fileinput.input():
        room, battery, temp, humid, date, time = list(csv.reader([line]))[0]
        current_usages.append({
            "room": room,
            "battery": battery,
            "temp": temp,
            "humid": humid,
            "date": date,
            "time": time
        })

    print(json.dumps({
        "currentUsages": current_usages
    }))


if __name__ == "__main__":
    try:
        sys.exit(main())
    except KeyboardInterrupt:
        sys.exit(128 + 2)

Code:
$ echo 'Office,100,19.3,47.3,10.02.2019,14:40:00\nBalcony,100,9.3,77.3,10.02.2019,14:40:00' | ./Untitled-22.py

Code:
{"currentUsages": [{"room": "Office", "battery": "100", "temp": "19.3", "humid": "47.3", "date": "10.02.2019", "time": "14:40:00"}, {"room": "Balcony", "battery": "100", "temp": "9.3", "humid": "77.3", "date": "10.02.2019", "time": "14:40:00"}]}
 
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh