Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Fragen zum CSV-Export

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Fragen zum CSV-Export

    This topic has been deleted. Only users with topic management privileges can see it.
    • S
      Smartin last edited by

      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

      OliverIO 1 Reply Last reply Reply Quote 0
      • OliverIO
        OliverIO @Smartin last edited by

        @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

        S 1 Reply Last reply Reply Quote 0
        • S
          Smartin @OliverIO last edited by Smartin

          @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);
          
          OliverIO 1 Reply Last reply Reply Quote 0
          • OliverIO
            OliverIO @Smartin last edited by

            @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 dein

            
            fs.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);
              }
            });
            
            
            S 1 Reply Last reply Reply Quote 1
            • S
              Smartin @OliverIO last edited by

              @oliverio
              Super, vielen Dank. Habe 2) mit deinem Codeschnipfel 😊 eben 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 mit

              const data = fs.readFileSync('test.csv', 'utf8');
              

              funktioniert. Aber wie es dann weitergehen würde ... ☹

              Oder ist das sowieso alles viel zu umständlich gedacht?

              OliverIO 1 Reply Last reply Reply Quote 0
              • OliverIO
                OliverIO @Smartin last edited by

                @smartin

                1. 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

                1 Reply Last reply Reply Quote 0
                • First post
                  Last post

                Support us

                ioBroker
                Community Adapters
                Donate

                1.0k
                Online

                31.6k
                Users

                79.6k
                Topics

                1.3m
                Posts

                2
                6
                370
                Loading More Posts
                • Oldest to Newest
                • Newest to Oldest
                • Most Votes
                Reply
                • Reply as topic
                Log in to reply
                Community
                Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                The ioBroker Community 2014-2023
                logo