如何在“逐行”npm 中遍历所有行

How to iterate through all lines in "line-by-line" npm?

本文关键字:遍历 npm 逐行      更新时间:2023-09-26

作为一种临时方法,我使用.txt文件来存储程序的某些变量。写作与fs.appendFile完美配合,但考虑到它的大小,用fs.readFile阅读是不合适的 - 我想从文件中获取某一行,npm 逐行告诉我可能会有所帮助。

不过,我对此有点迷茫。这是我调用的函数:

function LBL_SetValueToLine(path, lineid, value){
    var lr = new lblreader(path);
    var m = 0;
    lr.on('line', function (line) {
        // 'line' contains the current line without the trailing newline character.
        m=+1;
        if(m==lineid){ value = line; };
    });
};
调用

本身作为通常的函数调用发生,所有输入变量肯定是正确的。

我应该认为这不是一个正确的方法,但文档说,这是同步方法。但是,我可以看到 .on 的工作是 asysnc,因为它需要函数输入。

不确定它是否与问题有关,但无论如何,函数调用后的console.log总是表明变量尚未更改。

我该怎么做?

您可以使用核心节点 API 提供的Readline模块。

逐行的读取行 API 示例

const readline = require('readline');
const fs = require('fs');
const rl = readline.createInterface({
  input: fs.createReadStream('sample.txt')
});
rl.on('line', (line) => {
  console.log('Line from file:', line);
});

上面的示例取自 Node Readline API 文档

变量

没有更改,因为videoid是按值传入的。这意味着函数中对它的任何更改都不会反映在变量本身上。

例如:

function increment(num) {
  num++;
}
var a = 1;
increment(a);
console.log(a); // 1

若要传入将由函数更改的变量,需要传入对象类型。

例如:

function increment(num) {
  num.val++;
}
var a = {val: 1};
increment(a);
console.log(a); // Object {val: 2}

要将其应用于您的程序,您需要创建一个对象来保存videoid并在完成阅读后关闭流:

var videodata = {videoid: 'someID'};
function YTAPP_LBL_SetValueToLine(path, lineid, viddata){
  var lr = new lblreader(path);
  var m = 0;
  lr.on('line', function (line) {
    // 'line' contains the current line without the trailing newline character.
    m += 1;
    if(m == lineid){ 
      viddata.videoid = line;
      // Close the stream
      lr.close();
    }
  });

};