【问题标题】:How to search stream for string in node.js?如何在 node.js 中搜索字符串的流?
【发布时间】:2013-12-09 19:54:07
【问题描述】:

如何在流中搜索字符串然后打印出来?我的意思是使用createReadStream。我想出了如何使用indexOfreadFile 中查找字符串,但我读到使用流更有效。

更具体地说,我一直试图在流中找到一个字符串,然后打印出包含该字符串的整行。但是以下内容不断给我错误

fs.createReadStream(process.argv[2], function (err, data) {
      data.indexOf ...

目前,我的程序打印出整个流,而不仅仅是包含字符串的行。

var http = require('http'); 
var fs = require('fs');

var server = http.createServer( function(req, res) {

console.log("Request received.");

res.writeHead(200, {"Content-Type": "text/plain"});
res.write("Hello World\n\n\n");

var s = fs.createReadStream(process.argv[2]).pipe(res); 

s.on('end', function(){ res.end() }) 


});
server.listen(8000);

【问题讨论】:

    标签: javascript string node.js search stream


    【解决方案1】:

    流是缓冲的,因此传递给 data 事件(您通常会监听)的缓冲区不会以任何方式分成单独的行或分隔在单独的行上。

    您可以使用readline 模块进行逐行搜索:

    var fs        = require('fs');
    var readline  = require('readline');
    
    var server = http.createServer( function(req, res) {
      console.log("Request received.");
    
      res.writeHead(200, {"Content-Type": "text/plain"});
      res.write("Hello World\n\n\n");
    
      readline.createInterface({
        input     : fs.createReadStream(process.argv[2]),
        terminal  : false
      }).on('line', function(line) {
        var idx = line.indexOf(THE_SUBSTRING);
        if (idx !== -1) {
          res.write(line + '\n');
        }
      }).on('close', function() {
        res.end();
      });
    });
    

    编辑: readline 去掉换行符,所以res.write 加了一个)

    【讨论】:

    • 这很好用!我想知道是否有一种简单的方法可以打印出找到子字符串的每一行?目前,它只能打印出它找到的每个唯一子字符串的第一行。
    • @krikara 嗯,它匹配我的每一行;但是,它将它们全部输出在一行上,因为readline 去除了换行符,请参阅我的编辑以进行修复。
    • 是的,这很奇怪。也许是因为我从 Windows CMD 运行我的节点。不过,我确实安装了最新的稳定 npm 和节点。我将用下面的模块来试试运气。
    • 哦,其实我发现了问题。如果子字符串位于 .txt 文件的最后一行,它不会找到 res.write 子字符串。否则它会起作用。
    • @krikara 我认为在这种情况下文件不会以换行符结尾。
    【解决方案2】:

    您可以使用this module 在流中搜索字符串而无需缓冲

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-16
      • 2019-05-06
      • 2011-07-22
      相关资源
      最近更新 更多