如何在 node.js 中搜索字符串的流?

Posted

技术标签:

【中文标题】如何在 node.js 中搜索字符串的流?【英文标题】:How to search stream for string in 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);

【问题讨论】:

【参考方案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 在流中搜索字符串而无需缓冲

【讨论】:

以上是关于如何在 node.js 中搜索字符串的流?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Mongoose 在 Node JS 中进行全文搜索

Node.js 中的面向行的流

如何在 Node.js 中解析包含“NaN”的 JSON 字符串

不写入创建的流可写 node.js

如何在Node.js中提取部分字符串和字符串数组?

如何在 Node.js 中将字符串日期更改为时间戳?