无法对 fs.readFileSync() 返回的字符串运行 includes() 方法

Posted

技术标签:

【中文标题】无法对 fs.readFileSync() 返回的字符串运行 includes() 方法【英文标题】:Unable to run includes() method on string returned by fs.readFileSync() 【发布时间】:2021-11-14 18:31:44 【问题描述】:

有点麻烦:

let data = fs.readFileSync(pathToCsv, "utf8");

数据的价值是:

clan,mem1,mem2,mem3,mem4,language,managerID,serverJoinedDate
pm,
pm

(通过 console.log())

data.toString().includes("pm") 仍然是假的。

这是我的完整代码:

const filter = (m) => m.author.bot === false;
      await ogMessage.author.dmChannel
        .awaitMessages(filter, 
          max: 1,
          time: 60000,
        )
        .then((collected) => 
          if (clans[parseInt(collected.toJSON()[0].content) - 1]) 
            let clan = clans[parseInt(collected.toJSON()[0].content) - 1];
            let data = fs.readFileSync(pathToCsv, "utf8");
            console.log(typeof clan);
            // let reg = new RegExp(clan, "g");
            // let count = (data.match(reg) || []).length;
            if (data.split(",").includes(clan)) 
              ogMessage.author.send(
                "People from this clan are already registered!\nPlease contact the hosts for help!"
              );
              return;
             else 
              teamCheck = true;
            
           else 
            ogMessage.author.send("Invalid Clan! Please try again!");
            return;
          
        )
        .catch((collected) => 
          try 
            console.log("Error" + collected);
           catch (e) 
            console.log(e);
          
        );
      if (teamCheck === false) 
        return;
      

我尝试使用正则表达式拆分数据,但似乎对返回的字符串不起作用 readFileSync()

PS。我正在制作一个不和谐的机器人。

【问题讨论】:

在您提供的数据示例中,pm前面有一个空格。 pm前的空格其实应该是换行,我会在问题里更新一下 试试data.split(",").map(it => it.trim()).includes(clan) 它不起作用:(正如我之前提到的,在 pm 之前有一个换行符 你能发布console.log(data)console.log(clan)的输出吗? 【参考方案1】:

在源字符串中,pm 前面有一个空格。这就是为什么在调用 split("," 之后,结果数组中的元素 " pm" 和“pm”不等于它。 您只需要在其中搜索一些字符串之前修剪所有元素中的空格

【讨论】:

实际上它应该是pm之前的新行,由于某种原因它没有正确显示在问题中,但即使我做了一个简单的data.includes("pm"),它仍然没有工作,但字符串中有 pm 对吗? var a = 'clan,mem1,mem2,mem3,mem4,language,managerID,serverJoinedDate pm, pm'a.toString().includes('pm') 返回 true 是的,但在我的情况下它返回 false【参考方案2】:

问题出在氏族数组中。 我是这样定义的:

var clans = fs.readFileSync(pathToData, "utf8").split("\n");

但问题是readFileSync() 方法在数组的每个字符串之后添加了一个"\r"。这就是为什么它无法将氏族字符串与数据匹配

那么有效的是var clans = fs.readFileSync(pathToData, "utf8").split("\r\n");

现在,数组只包含字符串,includes() 方法可以找到匹配项!

【讨论】:

以上是关于无法对 fs.readFileSync() 返回的字符串运行 includes() 方法的主要内容,如果未能解决你的问题,请参考以下文章

fs.readFileSync 总是返回空字符串

节点 fs.readFileSync 返回一个 uInt8 数组而不是原始缓冲区数组?

JS:为什么fs.readFileSync()返回缓冲区,即使我之前使用toString()将其转换为字符串?

fs.readFileSync 不是 Meteor 的函数,React

如何为 fs.readFileSync() 捕获没有文件?

Node.JS fs.readFileSync() 错误参数