Ich möchte eine Textdatei mit Knoten mithilfe eines Befehlszeilenaufrufs wie folgt verarbeiten:
node app.js < input.txt
Jede Zeile der Datei muss einzeln verarbeitet werden, aber sobald sie verarbeitet wurde, kann die Eingabezeile vergessen werden.
Mit dem On-Data-Listener des STDIN wird der Eingangsdampf um eine Bytegröße aufgeteilt, sodass ich ihn einrichte.
process.stdin.resume();
process.stdin.setEncoding('utf8');
var lingeringLine = "";
process.stdin.on('data', function(chunk) {
lines = chunk.split("\n");
lines[0] = lingeringLine + lines[0];
lingeringLine = lines.pop();
lines.forEach(processLine);
});
process.stdin.on('end', function() {
processLine(lingeringLine);
});
Aber das scheint so schlampig. Um das erste und letzte Element des Linienarrays herum massieren müssen. Gibt es nicht einen eleganteren Weg, dies zu tun?
process.stdout
zu einem anderen beschreibbaren Stream wechseln - es könnte so einfach sein wieoutput: new require('stream').Writable()
node app.js < input.txt > output.txt
.terminal: false
an createInterface übergeben, wird dieses Problem behoben.quelle
Error: EISDIR: illegal operation on a directory, fstat at
tryStatSync (fs.js: 534: 13) `fs.readFileSync(0).toString()
readline
wurde speziell für die Arbeit mit Terminals entwickeltprocess.stdin.isTTY === true
. Es gibt viele Module, die Split-Funktionen für generische Streams wie Split bereitstellen . Es macht die Dinge super einfach:quelle
.on('end', doMoreStuff)
nach dem ersten hinzu.on()
. Denken Sie daran, dass, wenn Sie den Code nur normal nach der Anweisung mit schreiben.on()
, dieser Code ausgeführt wird, bevor eine Eingabe gelesen wird, da JavaScript nicht synchron ist.quelle
Teilen für andere:
Stream Zeile für Zeile lesen, sollte für große Dateien gut sein, die in stdin, meine Version, weitergeleitet werden:
quelle
In meinem Fall gab das Programm (elinks) Zeilen zurück, die leer aussahen, aber tatsächlich spezielle Terminalzeichen, Farbkontrollcodes und Rücktaste hatten, sodass
grep
die in anderen Antworten dargestellten Optionen für mich nicht funktionierten. Also habe ich dieses kleine Skript in Node.js geschrieben. Ich habe die Datei angerufentight
, aber das ist nur ein zufälliger Name.quelle