在Txt文件中查找字符串,删除整行

时间:2014-04-04 09:04:20

标签: javascript node.js fs

我目前正在使用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,所以我可以使用任何帮助!谢谢大家。

编辑:我还应该指出,我不需要命令识别方面的帮助。我只需要查找/删除部分的帮助。干杯!

2 个答案:

答案 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删除该行,然后将其重新修补。

demo

此外,您不应在节点中使用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>

希望这有帮助!