相关疑难解决方法(0)

在node.js中一次读取一行文件?

我试图一次读一行大文件.我在Quora上发现了一个关于这个问题的问题,但是我错过了一些联系,以使整个事情融合在一起.

 var Lazy=require("lazy");
 new Lazy(process.stdin)
     .lines
     .forEach(
          function(line) { 
              console.log(line.toString()); 
          }
 );
 process.stdin.resume();
Run Code Online (Sandbox Code Playgroud)

我想弄清楚的是我如何从文件而不是STDIN一次读取一行,如本示例所示.

我试过了:

 fs.open('./VeryBigFile.csv', 'r', '0666', Process);

 function Process(err, fd) {
    if (err) throw err;
    // DO lazy read 
 }
Run Code Online (Sandbox Code Playgroud)

但它不起作用.我知道,在一个紧要关头,我可以回到使用像PHP这样的东西,但我想弄清楚这一点.

我认为其他答案不会起作用,因为文件比我正在运行它的服务器大得多.

javascript file-io lazy-evaluation node.js

517
推荐指数
17
解决办法
40万
查看次数

如何处理来自 fs readline.Interface 异步迭代器的错误

基于processLineByLine()的示例,我注意到如果给定的文件名不存在,我们将无法捕获错误。在这种情况下,程序以如下内容结束:

UnhandledPromiseRejectionWarning:错误:ENOENT:没有这样的文件或目录

因此,我用来引发可捕获错误的最简单方法是对processLineByLine()函数进行 2 处修改:

  1. 将其放入发电机中,例如 function*
  2. await 文件存在检查 await access(filename, fs.constants.F_OK)

最后我不得不将readline.Interface实例转换为异步生成器。我特别不喜欢这最后一部分。结果lines()函数是这样的:

export async function* lines(filename) {
    await access(filename, fs.constants.F_OK)
    const lines = readline.createInterface({
        input: fs.createReadStream(filename),
        crlfDelay: Infinity
    })
    for await (const l of lines) {
        yield l
    }
}
Run Code Online (Sandbox Code Playgroud)

问题lines()如果文件名不存在,是否有更好的方法来返回异步迭代器或抛出错误?

BUG 报告:关于@jfriend00 观察,我在 nodejs 上打开了一个 Bug 问题:https : //github.com/nodejs/node/issues/30831

javascript node.js async-iterator

2
推荐指数
1
解决办法
1761
查看次数