如何在Node中逐行读取stdin
我正在寻找处理与节点的文本文件使用命令行调用如:
node app.js < input.txt
文件的每一行都需要单独处理,但一旦处理完,input行就会被遗忘。
使用标准input的数据监听器,我得到了一个字节大小的inputstream,所以我设置了它。
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); });
但是,这似乎是如此草率。 必须围绕线arrays的第一个和最后一个项目进行按摩。 有没有更好的方法来做到这一点?
您可以使用readline模块从stdin逐行读取:
var readline = require('readline'); var rl = readline.createInterface({ input: process.stdin, output: process.stdout, terminal: false }); rl.on('line', function(line){ console.log(line); })
readline
是专门devise用于terminal(即proccess.stdin.isTTY === true
)。 有很多模块为通用stream提供分割function,如分割 。 它使事情变得非常简单:
process.stdin.pipe(require('split')()).on('data', processLine) function processLine (line) { console.log(line + '!') }
// Work on POSIX and Windows var stdinBuffer = fs.readFileSync(0); // STDIN_FILENO = 0 console.log(stdinBuffer.toString());
分享给其他人:
一行一行读取stream,应该是很好的大文件input到标准input,我的版本:
var n=0; function on_line(line,cb) { ////one each line console.log(n++,"line ",line); return cb(); ////end of one each line } var fs = require('fs'); var readStream = fs.createReadStream('all_titles.txt'); //var readStream = process.stdin; readStream.pause(); readStream.setEncoding('utf8'); var buffer=[]; readStream.on('data', (chunk) => { const newlines=/[\r\n]+/; var lines=chunk.split(newlines) if(lines.length==1) { buffer.push(lines[0]); return; } buffer.push(lines[0]); var str=buffer.join(''); buffer.length=0; readStream.pause(); on_line(str,()=>{ var i=1,l=lines.length-1; i--; function while_next() { i++; if(i<l) { return on_line(lines[i],while_next); } else { buffer.push(lines.pop()); lines.length=0; return readStream.resume(); } } while_next(); }); }).on('end', ()=>{ if(buffer.length) var str=buffer.join(''); buffer.length=0; on_line(str,()=>{ ////after end console.error('done') ////end after end }); }); readStream.resume();
在我的情况下,程序(elinks)返回的行看起来是空的,但实际上有特殊的terminal字符,颜色控制代码和退格,所以其他答案中提出的grep
选项不适用于我。 所以我在Node.js中写了这个小脚本 我把这个文件叫tight
,但这只是一个随机的名字。
#!/usr/bin/env node function visible(a) { var R = '' for (var i = 0; i < a.length; i++) { if (a[i] == '\b') { R -= 1; continue; } if (a[i] == '\u001b') { while (a[i] != 'm' && i < a.length) i++ if (a[i] == undefined) break } else R += a[i] } return R } function empty(a) { a = visible(a) for (var i = 0; i < a.length; i++) { if (a[i] != ' ') return false } return true } var readline = require('readline') var rl = readline.createInterface({ input: process.stdin, output: process.stdout, terminal: false }) rl.on('line', function(line) { if (!empty(line)) console.log(line) })