NEWS
[gelöst] Inhalt Liste als Datei speichern und wieder laden
-
Hallo,
ich habe mich erst seit ein par Tagen mit den Listen beschäftigt. Meine Idee ist es einige Datenpunkte als Text-Datei zu speichern und bei Notwendigkeit diese wieder zu laden und in die Datenpunkte zurückzuschreiben.
Das Abspeichern hab ich hinbekommen aber beim Laden und zurückschreiben komm ich nicht weiter.
So sieht das Abspeichern aus:
Datei_W-W-A sieht so aus:const fs = require('fs'); switch(mode) { case 'r': return fs.readFileSync(Dateiname, 'utf8'); case 'w': return fs.writeFileSync(Dateiname, Daten); case 'a': return fs.appendFileSync(Dateiname, Daten); default: return 'Parameter mode muss "r", "w" oder "a" sein'; }
Bis hierher ist alles ok. Sieht zumindest so aus.
Nur das Laden und zurückschreiben in die Datenpunkte geht nicht. Hier erstmal den Test den ich versucht habe.
Hat jemand dazu eine Idee. Wo ist hier mein Fehler?
Danke -
Mit diesem Baustein aktualisierst du den Datenpunkt
i
mit demWert vom Datenpunkt i
, also mit genau dem was sich darin schon befindet.Zeig doch mal wie deine gespeicherte Datei aussieht, dann lässt sich vielleicht ein Vorschlag machen wie es gehen kann.
A.
-
@manfred-outlaw warum schreibst du die liste nicht direkt in einen datenpunkt und pflegst sie dort? für was ist die datei gut bzw. wird die weiterverarbeitet?
-
@asgothian Danke für die Antwort.
Hier ein Ausschnitt aus der Datei.
Beispiel.txtDanke
Manfred -
@liv-in-sky : Aktuel ist es nur mal ein Versuch die Datenpunkte zu exportieren, weiterzuverarbeiten und die Änderungen wieder zu Importieren. Aktuell speicher ich soweit möglich alles in den Datenpunkten ab. Aber es gab mal ein Fehler und Tage später hab ich festgestellt, dass da was nicht stimmt und hab eine Sicherung zurückgespielt. War ok aber auch da musste ich dann einiges nacharbeiten, da auch die Änderungen an div. anderen Punkten gefehlt hat. Daher einfach mal eine Idee entwickelt, wie ich diesem Problem entgegen wirken kann, sollte sowas wieder auftreten. Ok, nun kommt die Frage was ist da geschehen? Ja das wüsste ich auch gerne. Leider fehlt mir zu JS bzw. Blockly die Erfahrung. Daher mach ich sicherlich auch Fehler. Aber etwas zu lernen macht auch Spaß
Danke
Manfred -
ja - zum üben ist es gut - du musst dir einfach mehrere backitup instanzen einrichten - ich habe 4 davon - die 3 mal am tag meine scripte backupen und einmal ein iobroker backup
deine dateien , die du ja im linux system speicherst, sind ja auch weg oder veraltetet, wenn du einen plattencrash hast und alles neu machen musst - du musst die dateien ja auch irgendwie backupen
mit mehreren instanzen des backitups adapter sind die dp dann gesichert - oder hast du auch ein tägliches backup deiner nicht-iobroker-daten - also vom linux system
daher habe ich nachgefragt !
was nicht heißt, nicht doch ein wenig mit deinem script zu arbeiten, um zu üben
-
@manfred-outlaw Du machst 2 Fehler:
- Du trennst in der Datei sowohl den "key" (den Datenpunkt) als auch den "value" mit nur einem Trennzeichen.
- Du speicherst das ganze unformatiert weg.
Ich würde Dir eine von 2 Optionen empfehlen:
Option 1: Du änderst das Trennzeichen zwischen den "key" und "value" auf etwas anderes als das
,
(:
bietet sich an). In diesem Fall müsstest Du in deiner Schleife (dem für jeden Wert i mache) noch den Block hinzufügen:
setze KVP auf
Erzeuge liste aus Text mit Trennzeichen ":"
Dann kannst du im "schreibe" block als Objekt ID mit dem Blockaus der Liste KVP nimm das erste Element
und als Wertaus der Liste KVP nimm das letzte Element
arbeiten. KVP ist dabei eine neu zu definierende Variable.
Dazu musst du natürlich das Schreiben der Datei entsprechend anpassen.
Dazu baust du hier statt deserzeuge Liste mit.
Baustein einenerzeuge Text aus
Baustein mit 3 Andockmöglichkeiten. An die erste kommt danni
, an die 2.":"
, an die 3.Wert vom Objekt ID i
Option 2: Du schreibst die Datei als JSON raus.
Das ist insgesamt komplexer aber deutlich sicherer - allerdings kann ich das im Blockly heute nicht erklären. Das geht erst morgen. Wenn du diesen Weg gehst wirst Du unabhängig von den meisten Formatproblemen.
In allen anderen Fällen wirst Du auf Dauer Probleme bekommen, insbesondere wenn du mal einen Datenpunkt hast in dem ein Text mit einen
,
drin vorkommt. -
@asgothian : Danke für Antwort. Ja du hast recht, es gibt sogar Datenpunkte mit einem "," im Text. Das Thema hätte ich danach angegangen. Aber gut, wenn es gleich beachtet wird. Das Abspeichern hab ich nun umgesetzt. Nun muss ich noch das Einlesen und das zurückschreiben umsetzen. Das wird aber heute nichts mehr. Mach ich gleich morgen.
Beim Schreiben von i und Wert von i nutze ich nun den ":". Wenn ich aber die Daten in die Datei schreibe, nutze ich ja "Text aus Liste" und benötige da ja auch ein Trennzeichen. Das wäre dann "*". Oder hab ich da noch ein Denkfehler?
Dann die zweite Lösung von der du geschrieben hast. Alles in JSON zu schreiben. Ja JSON kenn ich vom Anschauen. Hab mir einige Formate schon angesehen. Aber mehr kann ich dazu nicht sagen. Wenn du dafür mal ein Beispiel hättest, würde ich mir das auch mal anschauen.
Danke
Manfred -
@liv-in-sky : Ich sichere die Daten einmal am Tag per backitup auf einem Netzwerkspeicher und ich erstelle auch noch ein Linux Backup, welches die komplette SanDisk (32GB) auch noch mal einmal die Woche sichert. Auch auf dem Netzwerkspeicher. Ja man kann sichern ohne Ende aber etwas übesieht man immer.
Danke für die Hilfe.
Manfred -
@asgothian Ich habe soeben den Import hinbekommen. Nun funktioniert es erstmal. Danke. Als Trennzeichen zwischen den einzelnen Datenpunkte hab ich "Neue Zeile \n" genommen und damit geht es echt gut.
Beim zurückschreiben hab ich noch einen Schönheitsfehler. Ich müsste eigentlich zwischen "Logikwert", "Zeichenkette"; "Zahl" und soweiter unterscheiden. Das muss ich mir noch mal genauer anschauen. Aber es geht erstmal.
Manfred