Je cherche à traiter un fichier texte avec un nœud en utilisant un appel de ligne de commande comme:
node app.js < input.txt
Chaque ligne du fichier doit être traitée individuellement, mais une fois traitée, la ligne d'entrée peut être oubliée.
En utilisant l'écouteur sur les données du stdin, j'obtiens la vapeur d'entrée fragmentée par une taille d'octet, donc je l'ai configuré.
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);
});
Mais cela semble tellement bâclé. Devoir masser le premier et le dernier élément du tableau de lignes. N'y a-t-il pas une manière plus élégante de faire cela?
process.stdout
à un flux inscriptible différent - cela pourrait être aussi simple queoutput: new require('stream').Writable()
node app.js < input.txt > output.txt
.terminal: false
à createInterface, cela résout ce problème.la source
Error: EISDIR: illegal operation on a directory, fstat at
tryStatSync (fs.js: 534: 13) `fs.readFileSync(0).toString()
readline
est spécifiquement conçu pour fonctionner avec le terminal (c'est-à-direprocess.stdin.isTTY === true
). Il existe de nombreux modules qui fournissent des fonctionnalités de fractionnement pour les flux génériques, comme split . Cela rend les choses très faciles:la source
.on('end', doMoreStuff)
après la première.on()
. N'oubliez pas que si vous écrivez simplement le code normalement après l'instruction with.on()
, ce code s'exécutera avant la lecture de toute entrée, car JavaScript n'est pas synchrone.la source
partager pour les autres:
lire le flux ligne par ligne, devrait être bon pour les gros fichiers redirigés vers stdin, ma version:
la source
Dans mon cas, le programme (elinks) a renvoyé des lignes qui semblaient vides, mais qui avaient en fait des caractères de terminal spéciaux, des codes de contrôle de couleur et un retour arrière, de sorte que les
grep
options présentées dans d'autres réponses ne fonctionnaient pas pour moi. J'ai donc écrit ce petit script dans Node.js. J'ai appelé le fichiertight
, mais ce n'est qu'un nom aléatoire.la source