Eu estou olhando para processar um arquivo de texto com o nó usando uma chamada de linha de comando como:
node app.js < input.txt
Cada linha do arquivo precisa ser processada individualmente, mas uma vez processada, a linha de entrada pode ser esquecida.
Usando o ouvinte em dados do stdin, recebo o vapor de entrada dividido por um tamanho de byte, então configurei isso.
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);
});
Mas isso parece tão desleixado. Ter que massagear o primeiro e o último itens da matriz de linhas. Não existe uma maneira mais elegante de fazer isso?
process.stdout
para um fluxo gravável diferente - poderia ser tão simples quantooutput: new require('stream').Writable()
node app.js < input.txt > output.txt
.terminal: false
para createInterface, ele corrige esse problema.fonte
Error: EISDIR: illegal operation on a directory, fstat at
tryStatSync (fs.js: 534: 13) `fs.readFileSync(0).toString()
readline
foi projetado especificamente para funcionar com o terminal (ou sejaprocess.stdin.isTTY === true
). Existem muitos módulos que fornecem funcionalidade dividida para fluxos genéricos, como divisão . Isso torna as coisas super fáceis:fonte
.on('end', doMoreStuff)
após a primeira.on()
. Lembre-se de que, se você escrever o código normalmente após a instrução.on()
, esse código será executado antes que qualquer entrada seja lida, porque o JavaScript não é síncrono.fonte
compartilhando por outros:
ler fluxo linha por linha, deve ser bom para arquivos grandes canalizados para stdin, minha versão:
fonte
No meu caso, o programa (elinks) retornou linhas que pareciam vazias, mas na verdade tinham caracteres terminais especiais, códigos de controle de cores e backspace; portanto, as
grep
opções apresentadas em outras respostas não funcionaram para mim. Então, eu escrevi esse pequeno script no Node.js. Liguei para o arquivotight
, mas esse é apenas um nome aleatório.fonte