在 Node JS 中只读取文件第一行的最有效方法是什么?

新手上路,请多包涵

假设您有许多长文本文件,您只需要从每个文件的第一行提取数据(无需阅读任何进一步的内容)。 Node JS 中最好的方法是什么?

谢谢!

原文由 Pensierinmusica 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

我最终采用了这个解决方案,这似乎是迄今为止我见过的性能最高的解决方案:

 var fs = require('fs');
var Q = require('q');

function readFirstLine (path) {
  return Q.promise(function (resolve, reject) {
    var rs = fs.createReadStream(path, {encoding: 'utf8'});
    var acc = '';
    var pos = 0;
    var index;
    rs
      .on('data', function (chunk) {
        index = chunk.indexOf('\n');
        acc += chunk;
        index !== -1 ? rs.close() : pos += chunk.length;
      })
      .on('close', function () {
        resolve(acc.slice(0, pos + index));
      })
      .on('error', function (err) {
        reject(err);
      })
  });
}

为了方便起见,我创建了一个 npm 模块,命名为“ firstline ”。

感谢@dandavis 建议使用 String.prototype.slice()

原文由 Pensierinmusica 发布,翻译遵循 CC BY-SA 3.0 许可协议

对于这种情况几乎有一个内置模块 - readline 。它避免弄乱块等。代码如下所示:

 const fs = require('fs');
const readline = require('readline');

async function getFirstLine(pathToFile) {
  const readable = fs.createReadStream(pathToFile);
  const reader = readline.createInterface({ input: readable });
  const line = await new Promise((resolve) => {
    reader.on('line', (line) => {
      reader.close();
      resolve(line);
    });
  });
  readable.close();
  return line;
}

原文由 Viktor Molokostov 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题