【问题标题】:How to wrap readline from stdin to use in pipeline?如何从标准输入包装 readline 以在管道中使用?
【发布时间】:2019-10-07 08:37:26
【问题描述】:

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

这是我目前所拥有的:

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 我想获得一个以定义的块(行)提供数据的流。 我该怎么做?

谢谢, 延斯

【问题讨论】:

  • 如果你想创建一个流来从一个圆角读取数据,使用'fs.createreadstream'
  • Node.js 有一个内置的readline 模块
  • 好的,所以我添加了 readline。如何将其放入管道?

标签: javascript node.js stream


【解决方案1】:

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.')
            }
        }
);

【讨论】:

  • 谢谢,我知道这个选项。我想使用管道而不是这种构造。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-11
  • 1970-01-01
  • 2016-04-06
  • 1970-01-01
  • 2010-12-25
  • 2023-02-26
  • 1970-01-01
相关资源
最近更新 更多