Estoy buscando procesar un archivo de texto con nodo usando una llamada de línea de comando como:
node app.js < input.txt
Cada línea del archivo debe procesarse individualmente, pero una vez procesada, la línea de entrada puede olvidarse.
Usando el oyente en datos del stdin, obtengo el vapor de entrada fragmentado por un tamaño de byte, así que configuré esto.
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);
});
Pero esto parece tan descuidado. Tener que masajear alrededor del primer y último elemento del conjunto de líneas. ¿No hay una forma más elegante de hacer esto?
process.stdout
a una secuencia de escritura diferente, podría ser tan simple comooutput: new require('stream').Writable()
node app.js < input.txt > output.txt
.terminal: false
para crear Interface, soluciona este problema.fuente
Error: EISDIR: illegal operation on a directory, fstat at
tryStatSync (fs.js: 534: 13) `fs.readFileSync(0).toString()
readline
está específicamente diseñado para trabajar con terminal (es decirprocess.stdin.isTTY === true
). Hay muchos módulos que proporcionan funcionalidad dividida para transmisiones genéricas, como división . Hace las cosas súper fáciles:fuente
.on('end', doMoreStuff)
después del primero.on()
. Recuerde que si solo escribe el código normalmente después de la declaración con.on()
, ese código se ejecutará antes de que se lea cualquier entrada, porque JavaScript no es síncrono.fuente
compartir para otros:
leer flujo línea por línea, debería ser bueno para archivos grandes canalizados en stdin, mi versión:
fuente
En mi caso, el programa (enlaces) devolvió líneas que parecían vacías, pero de hecho tenían caracteres terminales especiales, códigos de control de color y retroceso, por lo que las
grep
opciones presentadas en otras respuestas no me funcionaron. Entonces escribí este pequeño script en Node.js. Llamé al archivotight
, pero ese es solo un nombre aleatorio.fuente