NEWS
Fragen zum CSV-Export
-
Moin,
zwei Fragen zum CSV-Export
1:fs.appendFileSync("/opt/iobroker/iobroker-data/test.csv", string);
hängt die string-Zeile unten an die CSV-Datei an.
fs.writeFile("/opt/iobroker/iobroker-data/test.csv", string);
überschreibt die bisherige Datei.
Wie aber kriege ich es hin, dass die aktualisierte test.csv z.B. nur noch die letzten 9 Einträge + die neue Zeile enthält ?2:
Ich logge in einer anderen CSV-Datei (2022.csv) tägliche Werte (Temp, Hum, Stromverbrauch, Kosten usw.).
Wie müsste ich vorgehen damit am 01.01.2023 automatisch eine neue leere 2023.csv angelegt wird und die Werte ab dann in diese Datei gespeichert werden?Gruß aus dem Norden
-
@smartin
1)
Entweder die csv Datei wieder in eine Datenstruktur einlesen, Daten anhängen und komplett wieder speichern
Oder alternativ die folgende Funktion des filesystem Objektes von Node verwenden
appendFile
https://nodejs.org/api/fs.html#filehandleappendfiledata-options
writeFile gehört ebenfalls zu diesem Objekt
2)
Einen neuen Dateinamen vergeben?
Ich würde dann den Dateinamen jeweils dynamisch aus dem Datum des aktuellen Jahres ermitteln
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getYear?retiredLocale=de -
@OliverIO
Zu 1)
Ok, da stehe ich als JS-Greenhorn komplett auf der Leitung und weiß leider nicht wie ich das beides nutzen müsste (node Version 14.20.0)Zu 2)
Wäre das so richtig um den Dateinamen dynamisch zu setzen bzw. zu verwenden?var today = new Date(); var year = today.getFullYear(); var csv_pfad = "/opt/iobroker/iobroker-data/" + year + ".csv"; fs.appendFileSync(csv_pfad, string);
-
@smartin
Ja sieht gut aus.
Allerdings macht append genau das was es heißt, es hängt an.
Csv besteht ja einmal aus der ersten Zeile mit den Feld Bezeichnungen und dann beliebig viele Zeilen mit den Daten
Wenn du eine neue Datei anlegst solltest du die erste Zeile mit writeFile schreiben und danach kannst du die anhängen.
Ob du die erste Zeile schreiben musst kannst du am besten daran feststellen ob dieser Dateiname existiert.
Dazu kann folgender schnipfel hilfreich deinfs.stat('foo.txt', function(err, stat) { if (err == null) { console.log('File exists'); } else if (err.code === 'ENOENT') { // file does not exist fs.writeFile('log.txt', 'Some log\n'); } else { console.log('Some other error: ', err.code); } });
-
@oliverio
Super, vielen Dank. Habe 2) mit deinem Codeschnipfeleben mit ein wenig basteln hinbekommen. Klappt jetzt super, erst Prüfung ob Datei vorhanden ist, falls ja kommt der Log oder falls nicht wird eine neue Datei mit dynamischem Dateinamen erstellt, Kopfzeilen eingetragen und dann die Daten geloggt. Perfekt!
Kann mir noch jemand bei 1) helfen ?
Wenn ich es richtig verstehe müsste- die bestehende CSV-Datei test.csv in eine Variable eingelesen werden
- dort dann alles außer die letzten x Zeilen gelöscht werden
- die bestehende test.csv gelöscht werden
- die Datei neu erstellt werden
- die Kopfzeilen eingetragen werden
- die übrig gebliebenen Zeilen und die neuen Logs angehängt werden
Das einlesen und das heraus parsen der Zeilen schaffe ich nicht.
Ich vermute, dass das einlesen mitconst data = fs.readFileSync('test.csv', 'utf8');
funktioniert. Aber wie es dann weitergehen würde ...
Oder ist das sowieso alles viel zu umständlich gedacht?
-
- ODER 2)
du hast doch die aufgabe schon gelöst,
oder willst du es als challenge auch lösen?
um mit csv dateien umgehen zu können lohnt es sich das rad nicht neu zu erfinden,
sondern eine bibliothek zu nutzen. muss man sich allerdings etwas einlesen. aber man muss viele probleme nicht lösen, da es der author schon gemacht hat.https://www.npmjs.com/package/csv
die kann csv lesen und auch schreiben. details stehen in der doku auf github - ODER 2)