节点逐行从文件中读取数据...对其进行处理并将其保存回发行

时间:2019-05-05 13:29:49

标签: javascript node.js

在文件中,我的数据看起来像这样:

id=1349 console.log('done this') status=waiting
id=2345 console.log('done this too') status=waiting

如果此时会读取一行,请更改状态以完成操作并将其保存回文件。

这就是我所拥有的:

fs.readFile('list.txt', 'utf8', function (err,data) {

  if (data.includes('status=waiting')) {

    const str = data.trim();
    const arr = str.replace(/;$/gm, '').split(/\n/g)

    for (var i = 0; i < arr.length; i++) {

      var result = arr[i].replace('status=waiting', 'status=complete');

      var temp = result.split(" ");
      console.log(temp[1]);
      eval(temp[1]); //run the console.log

      console.log(`RESULT IS: ${result}`); // This line should now have status=complete when it saves below

      // Now Save it back with the status=complete in it
      fs.writeFile('list.txt', result, 'utf8', function (err) {
        if (err) return console.log(err);
      });


    };


  }

});

问题是保存...尽管变量结果在保存之前是正确的,但它只是替换文件文本而仅保存最后一个。

我该如何解决?

ps:我知道不应该使用eval,但这只是供个人使用。

1 个答案:

答案 0 :(得分:1)

写入文件时,不能一行一行地写,而是写全部内容。对于逐行方法,您可能要使用fs.appendfile,该方法表示方法为Monoid Morphisms, Products, and Coproducts,只是将行追加到文件上,而不删除初始行。这样可能对您不起作用。

所以,我想您想要的是

  • 读取整个文件内容
  • 解析为每行的数组
  • 遍历每一行
  • 如果status=waiting,请替换为status=complete
  • 最后,将全部内容保存回同一文件中
  fs.readFile("list.txt", "utf8", (err, data) => {
    if (err) {
      throw new Error(err);
    }

    const dataByLine = data.toString().split("\n");

    const newData = dataByLine.map(line => {
      if (line.includes("status=waiting")) {
        const newLine = line.replace("status=waiting", "status=complete");

        return newLine;
      }

      return line;
    });

    const result = newData.join("\n");

    fs.writeFile("list.txt", result, "utf8", err => {
      if (err) return console.log(err);

      console.log('The file has been saved!');

    });
  });

PS-这不包括您的任何评估日志。它只是向您显示了朝正确方向迈出的一步。