fs.readFileSync返回的字符串调用includes()方法结果为false如何解决?
问题复现
执行代码let data = fs.readFileSync(pathToCsv, "utf8");后,console.log打印data输出如下:
clan,mem1,mem2,mem3,mem4,language,managerID,serverJoinedDate pm, pm
执行data.toString().includes("pm")返回false,尝试分割字符串、正则匹配都没有生效。
完整代码
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; }
补充说明
开发场景为Discord机器人开发。
故障原因
- CSV读取到的内容自带换行符,按逗号分割后得到的
pm相关项实际携带了\n等换行控制符,和你要匹配的纯pm字符串不完全相等,导致includes匹配失败 - 可能存在UTF-8 BOM头、零宽空格等肉眼不可见的特殊字符,影响匹配结果
- 若
clan变量不是字符串类型,严格相等匹配也会返回失败
修复方案
- 先对读取到的CSV内容和匹配目标做标准化清理,移除所有不可见控制字符和多余空白
- 分割后遍历匹配时单独对每一项做清理,避免换行符、空格影响匹配结果
修改后的参考代码如下:
let clan = clans[parseInt(collected.toJSON()[0].content) - 1].toString().trim(); let data = fs.readFileSync(pathToCsv, "utf8"); // 移除所有不可见控制字符、BOM头 const cleanedData = data.replace(/[\u0000-\u001F\u007F-\u009F\uFEFF]/g, ''); // 分割后逐个清理匹配 const clanExists = cleanedData.split(',').some(item => item.trim() === clan); if (clanExists) { ogMessage.author.send( "People from this clan are already registered!\nPlease contact the hosts for help!" ); return; } else { teamCheck = true; }
如果清理后还是匹配失败,可以打印字符串的十六进制编码确认实际内容:
console.log(Buffer.from(data).toString('hex'))
正常pm对应的十六进制编码为706d,如果输出不符,说明文件编码读取错误,需要确认CSV文件的实际编码后指定对应编码读取即可。
内容的提问来源于stack exchange,提问作者Rijak Singh
相关产品推荐
相关产品推荐

