我正在寻找使用命令行调用处理节点的文本文件,如:
node app.js < input.txt
文件的每一行都需要单独处理,但一旦处理,输入行就会被遗忘.
使用stdin的on-data监听器,我得到一个字节大小的输入蒸汽,所以我设置了它.
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);
});
Run Code Online (Sandbox Code Playgroud)
但这似乎很草率.必须按线阵列的第一个和最后一个项目.有没有更优雅的方式来做到这一点?
lev*_*evi 179
您可以使用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);
})
Run Code Online (Sandbox Code Playgroud)
vku*_*kin 54
readline
专门设计用于终端(即process.stdin.isTTY === true
).有许多模块为通用流提供分离功能,例如拆分.它让事情变得非常简单:
process.stdin.pipe(require('split')()).on('data', processLine)
function processLine (line) {
console.log(line + '!')
}
Run Code Online (Sandbox Code Playgroud)
Zea*_*lic 41
// Work on POSIX and Windows
var stdinBuffer = fs.readFileSync(0); // STDIN_FILENO = 0
console.log(stdinBuffer.toString());
Run Code Online (Sandbox Code Playgroud)
小智 10
#!/usr/bin/env node
const EventEmitter = require('events');
function stdinLineByLine() {
const stdin = new EventEmitter();
let buff = "";
process.stdin
.on('data', data => {
buff += data;
lines = buff.split(/[\r\n|\n]/);
buff = lines.pop();
lines.forEach(line => stdin.emit('line', line));
})
.on('end', () => {
if (buff.length > 0) stdin.emit('line', buff);
});
return stdin;
}
const stdin = stdinLineByLine();
stdin.on('line', console.log);
Run Code Online (Sandbox Code Playgroud)
自从发布接受的答案以来,Node.js 已经发生了很大的变化,所以这里是一个现代示例,用于readline
将流拆分为行,for await
从流中读取数据,以及ES 模块:
import { createInterface } from "node:readline"
for await (const line of createInterface({ input: process.stdin })) {
// Do something with `line` here.
console.log(line)
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
137658 次 |
最近记录: |