NodeJS 如何在“逐行”npm中迭代所有行?

unftdfkk  于 2023-06-22  发布在  Node.js
关注(0)|答案(2)|浏览(100)

作为一种临时方法,我使用.txt文件来存储程序的某些变量。使用fs.appendFile可以很好地进行写入,但考虑到它的大小,使用fs.readFile阅读并不合适-我想从文件中获取某行npm line-by-line被告知可能会有所帮助。
不过,我有点迷失了。这是我调用的一个函数:

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总是指示变量没有被更改。
我该怎么做?

njthzxwz

njthzxwz1#

您可以使用Core Node 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文档

gg0vcinb

gg0vcinb2#

变量没有改变,因为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();
    }
  });


};

相关问题