我目前正在使用node.js创建一个IRC bot。机器人允许用户将歌曲链接添加到数据库。每当有人提交一首歌时,它就会被添加到新的“shuffle.txt”行中:
user1,The Beatles,Yesterday,(youtube link)
user2,The Rolling Stones,Angie,(youtube link)
user1,The Bealtes,Yellow Sumbarine,(youtube link)
请注意,user1在最新添加的内容中输错了一些信息。我正在尝试制作UNDO命令,以便用户可以删除最近输入的行。我打算通过在shuffle.txt中查找最新出现的名称并删除它所找到的整行来做到这一点。这是我的消息监听器:
bot.addListener('message', function(from, to, message) {
if (message.indexOf(config.prefix) == 0) {
message = message.slice(1);
var token = message.split(" ");
if (token[0] == 'undo') {
//find and delete
}
}
});
输入命令的用户存储为from
我假设我必须按照以下方式做点什么:
var songList = fs.readFileSync('shuffle.txt', 'utf8');
var position = songList.indexOf(from);
if (position != -1) { //if 'from' found
//find LAST occurrence of 'from'
//get length from here to next occurrence of '\n'
//substr(length + 1)
fs.writeFile('shuffle.txt', songList, function(err) {
if (err) {
console.log (err);
}
}
我是JavaScript的新手,这是我第一次使用node.js,所以我可以使用任何帮助!谢谢大家。
编辑:我还应该指出,我不需要命令识别方面的帮助。我只需要查找/删除部分的帮助。干杯!
答案 0 :(得分:3)
Edit2:使用新解决方案进行编辑。
你可以试试这个:
fs.readFile('shuffle.txt', function read(err, data) {
if (err) {
throw err;
}
lastIndex = function(){
for (var i = data_array.length - 1; i > -1; i--)
if (data_array[i].match('user1'))
return i;
}()
delete data_array[lastIndex];
});
将文件拆分为行,使用简单的循环向后找到最后一行,使用delete
删除该行,然后将其重新修补。
此外,您不应在节点中使用readFileSync
,因为阻塞节点可能是危险的,因为它是单线程的。
答案 1 :(得分:1)
这似乎工作正常。它是自包含的,因此您只需粘贴到HTML文件中即可运行。 基本上保持运行正则表达式以匹配从传递的用户名开始的整行。返回整行(" gm"正则表达式的一部分告诉它一次匹配一行)作为字符串。
然后你只需在数据中替换返回的行(作为字符串)。 请注意,这假定该行在文本文件中是唯一的。如果你认为人们可能已经进入过几次同一行(但只想删除最后一行),那么“非懒惰”就会出现这种情况。我没有注释的选项最好。我还没有测试如果该行在数据中的第一个或最后一行会发生什么。
<html>
<head>
<script type="text/javascript">
var sData="user1,The Beatles,Yesterday,(youtube link)\nuser2,The Rolling Stones,Angie,(youtube link)\nuser1,The Bealtes,Yellow Sumbarine,(youtube link)\nuser3,The Rolling Stones,Angie,(youtube link)";
function replaceLastEntry(sText) {
sNewData=sData;
var re=new RegExp("^"+sText+".*$","gm"); // matches whole lines starting with sText
var lastIndex=-1;
var i=0;
var sMatch=re.exec(sData)!= null;
while (sMatch!=null)
{
i++
lastIndex=re.lastIndex;
lastMatch=sMatch.toString(); // make note of last successful match - gives full line
sMatch=re.exec(sData);
}
// at this point lastMatch contains the whole line which needs to be removed.
// lastIndex is the string position of the character after the LAST string matched (ie the end of the matched line)
// sNewData = sData.replace(lastMatch,""); // Lazy way - assumes the line is unique within the file
// non-lazy way : locate the text by position returned and remove it
sNewData = sData.substr(0, lastIndex-lastMatch.length-1) + sData.substr(lastIndex);
document.getElementById("Data").innerHTML=sData
document.getElementById("NewData").innerHTML=sNewData
document.getElementById("LastMatch").innerHTML=lastMatch
}
</script>
</head>
<body onload="replaceLastEntry('user1','newvalue')">
Data: <pre id="Data"></pre>
New Data:<pre id="NewData"></pre>
Last Match: <pre id="LastMatch"></pre>
</body>
</html>
希望这有帮助!