首页 > 解决方案 > 使用 Node.js 在文本文件中完成作业后的值更新

问题描述

我有这样的文本数据,我标记 * 字符集以检查未完成的工作。

pt

这是我的部分代码。我想在 txt 行以 * charset 开头时制作它,它应该被处理,并且在处理过的字符串的 * charset 应该被删除之后。

fs.readFile('data.txt', async function (err, data) {
    if (err) throw err;
    let array = data.toString().split("\n");
    for (i in array) {
      if (array[i].charAt(0) === '*') {
        console.log(`Now Processing : ${array[i]} | ${array.length - i -1} items left`);
        //
        // SOME JOBS
        //


        let newValue = array[i].replace('*', '');

        fs.writeFile('data.txt', newValue, 'utf-8', function (err, data) {
          if (err) throw err;
          console.log('Done!');
        })

      } else {
        console.log(`${array[i]} Already Captured`)
      }

标签: javascriptnode.js

解决方案


据我了解,您正在尝试通读文件,查找包含“*”字符的行,做一些工作,然后从受影响的行中删除 *。

首先,调用fs.writeFile发生在循环内,因此该循环的每次迭代都会调用 writeFile 函数。从 nodejs 文档中,此方法将“......异步将数据写入文件,如果文件已存在则替换该文件。” 您正在用每次迭代替换文件。您想要做的是使用fs.appendFile或更好地将“附加”系统标志传递给 writeFile。系统标志可以在这里看到。看一下'a'标志并将其传递给writeFile的选项对象。

您在 readFile 回调中对 async 的使用也不完整,因为您没有在该回调中调用 await 。

fs.readFile('data.txt', async function (err, data) {
    if (err) throw err;
    let array = data.toString().split("\n");
    for (i in array) {
        if (array[i].charAt(0) === '*') {
        console.log(`Now Processing : ${array[i]} | ${array.length - i -1} items left`);
        //
        // SOME JOBS
        //


        let newValue = array[i].replace('*', '');
        newValue = newValue + '\n';

        await fs.appendFile('data.txt', newValue, 'utf-8', function (err, data) {
            if (err) throw err;
            console.log('Done!');
        })

        } else {
        console.log(`${array[i]} Already Captured`)
        }
    }
});

推荐阅读