NEWS
Javaskript: Letzte Zeile einer Textdatei lesen
-
Na ich denke - die Bibliothek ist doch nicht das richtige - da sie eine Datei überwacht und Dir die letzte Zeile liefert, wenn sich eine Datei ändert. Und Du möchtest ja selbst zu einer bestimmten Zeit eine Datei einlesen.
-
@mickym
Ich habe das so verstanden, dass man überwachen oder lesen kann.
Ich könnte aber auch den "normalen" linux tail Befehl verwenden.tail --lines=1 datei.txt > letzteZeile.txt
würde mir die letzte Zeile in eine Datei schreiben die ich dann mit fs.read einlesen könnte.
Wie schicke ich aus Javaskript einen Konsolenbefehl ab (wenn das überhaupt geht)? -
@wolfgangfb Über Exec kannst Du kommandozeilenbefehle ausführen:
https://www.iobroker.net/docu/index-81.htm?page_id=5809#exec_8211_execute_some_OS_command_like_8220cp_file1_file28221Aber ich denke vielleicht kann Dir ein JS Entwickler Dir besser helfen. @paul53 ist die beste Adresse bei solchen Fragen.
-
@wolfgangfb sagte: Ich könnte aber auch den "normalen" linux tail Befehl verwenden.
Versuche es mal mit exec()
Die Variable result muss genau so geschrieben werden und enthält die Ausgabe an stdout.
exec('tail --lines=1 /opt/iobroker/iobroker-data/test.txt', function (error, stdout, stderr) { log(stdout); });
-
Hi
warum mit tail / exec() etc.?
Mein oben gepostetes Script liest bei mir die letzte Zeiler einer Textdatei, knapp 200MB, in 1-2 Millisekunden aus.
Vorteil meiner Lösung: bereits alle Module vorhanden, undfs
ist bereits "preloaded" im JS-Adapter. - siehe https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#following-functions-can-be-used-in-scripts -
Wenn ich dieses Skript ausführe kommt;
javascript.0 (2551) script.js.Programmieren.tail: readAsync() error - TypeError: Cannot read property 'stat' of undefined at readAsync (script.js.Programmieren.tail:51:40) at test (script.js.Programmieren.tail:17:24) at script.js.Programmieren.tail:12:1 at script.js.Programmieren.tail:106:3 at Script.runInContext (vm.js:130:18) at Script.runInNewContext (vm.js:135:17) at execute (/opt/iobroker/node_modules/iobroker.javascript/main.js:1509:27) at prepareScript (/opt/iobroker/node_modules/iobroker.javascript/main.js:1717:38) at /opt/iobroker/node_modules/iobroker.javascript/main.js:1817:17 at Immediate._onImmediate (/opt/iobroker/node_modules/iobroker.javascript/main.js:1306:17)
-
@wolfgangfb
kannst du mal den Code posten, wie du das Script aufrufst? -
@wolfgangfb Dateiname in Zeile 7 geändert?
-
Ich habe den Code 1:1 in ein neues Skript kopiert, in Zeile 7 den Dateinamen geändert und dann auf "Save" geklickt.
-
Seltsam, denn das Script sollte das abfangen, also fehlende Berechtigung oder nicht vorhandene Datei, und dies sauber im Log anzeigen, z.B.
readAsync() error - Error: EACCES: permission denied, open '/opt/iobroker/log/x.log'
. oderreadAsync() error - Error: ENOENT: no such file or directory, stat '/opt/iobroker/log/xy.log'
Welche node.js-Version verwendest du?
--> In Konsole:node -v
eingeben