如何将读取行从标准包装到管道中使用?



我正在编写一个脚本来处理控制台中程序的输出。该程序会产生大量结果,我想即时过滤它们,以便只保留我需要的内容。

这是我到目前为止所拥有的:

const {pipeline, Transform} = require('stream');
var readline = require('readline');
class FilterBlastOutput extends Transform {
constructor(options) {
super(options);
}
_transform(chunk,encoding,callback) {
if(chunk === 'u0003')
process.exit();
let row = chunk.split("t");
if(row[3] >= 19 && row[4] <= 1) 
callback(null,chunk);
}
}
// Added after suggestion to use readline module
var rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
terminal: false
});
pipeline(
process.stdin,
new FilterBlastOutput(),
process.stdout,
err => {
if(err) {
console.log("Pipeline failed: ");
} else {
console.log('Pipeline succeeded.')
}
}
);

在管道中(..(我使用process.stdin。 而不是 process.stdin,我想得到一个流,以定义的块(行(提供数据。 我该怎么做?

谢谢 延斯

Readline示例(无转换流(:

const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin
});
rl.on('line', filterBlastOutput)
function filterBlastOutput(line) {
let row = line.split("t");
if(row[3] >= 19 && row[4] <= 1);
process.stdout.write(line);
}

编辑

如果要使用pipeline,请使用 split2:

const {pipeline, Transform} = require('stream');
const split2 = require('split2');
class FilterBlastOutput extends Transform {
constructor(options) {
super(options);
}
_transform(chunk,encoding,callback) {
if(chunk === 'u0003')
process.exit();
let row = chunk.split("t");
if(row[3] >= 19 && row[4] <= 1) 
callback(null,chunk);
}
}
pipeline(
process.stdin,
split2(),
new FilterBlastOutput(),
process.stdout,
err => {
if(err) {
console.log("Pipeline failed: ");
} else {
console.log('Pipeline succeeded.')
}
}
);

最新更新