2014-04-04 21 views
6

Şu anda bir IRC botu oluşturmak için node.js ile çalışıyorum. Bot, kullanıcıların bir veritabanına şarkı linkleri eklemesine izin verir. Her seferinde birileri gibi "shuffle.txt" nin yeni bir satıra eklenir, bir şarkı gönderir: en son ek olarak bazı bilgiler yanlış yazmış kullanici1Bir Txt Dosyasında Dize Bul, Tüm Satırı Sil

user1,The Beatles,Yesterday,(youtube link) 
user2,The Rolling Stones,Angie,(youtube link) 
user1,The Bealtes,Yellow Sumbarine,(youtube link) 

dikkat edin. Bir UNDO komutu yapmaya çalışıyorum, böylece kullanıcı en son girilen satırı silebilir. Bunu, shuffle.txt dosyasında en son gerçekleşen yeri bularak ve üzerinde bulunan satırın tamamını silerek yapmayı planlıyorum.

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); 
    } 

} 

I: komutu girerek kullanıcı Ben bu satırlar boyunca bir şey yapmak gerekecek tahmin ediyorum from

olarak depolanır

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 
      } 

    } 
}); 

: İşte benim mesaj dinleyici 'javascript için yeni ve bu benim node.js'yi ilk defa kullanıyorum, böylece alabileceğim herhangi bir yardımı kullanabilirim! Herkese teşekkürler.

DÜZENLEME: Komut tanıma konusunda yardıma ihtiyacım olmadığını da belirtmeliyim. Sadece bulma/silme bölümü ile ilgili yardıma ihtiyacım var. Şerefe!

cevap

2

Edit2: yeni bir çözümle düzenlenmiştir.

Bu deneyebilirsiniz: satırlara

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]; 

}); 

Bölünmüş dosyasını, basit bir döngü geriye gidiş ile son satırı bulun delete kullanarak çizgiyi kaldırmak, sonra tekrar bir araya yama. o dişli bekar beri düğümü engelleme tehlikeli olabilir olarak

demo

Ayrıca, düğümünde readFileSync kullanmamalısınız.

+0

Hızlı yanıt için teşekkürler! Burada gördüğüm tek sorun, "user1" veya birincisinin SON olayını bulan koddur. İlk olayı silersem, bunun yerine en yenisinden ziyade en eski gönderilerini silecek. Tekrar teşekkürler! – Santi

+0

Evet, evet, evet, – Mosho

+0

Jeez çabuk ol, yardım çok teşekkürler. Ne yazık ki 3PM'den beri bu bot üzerinde çalışıyorum ve şu an 5:23 AM, biraz uyumaya ihtiyacım var. Nasıl çalıştığını size bildirmek için yarın tekrar kontrol edeceğim! Şerefe! – Santi

1

Bu işe yarıyor gibi görünüyor. Kendinde bulunur, böylece çalışmasını görmek için bir HTML dosyasına yapıştırabilirsiniz. Temel olarak, aktarılan kullanıcı adıyla başlayan tüm satırın eşleşmesi için düzenli bir ifade çalıştırmaya devam edin. Tüm satır döndürülür ("gm" düzenli ifadenin bir parçası, bir satırdaki bir dizeyle eşleşmesini söyler) bir dize olarak.

Ardından, yalnızca bu döndürülen satırın (dize olarak) veri içindeki yerini aldınız. Bunun, satırın metin dosyasında benzersiz olduğunu varsayar. İnsanların aynı çizgiye birkaç kez girmiş olabileceğini düşünürseniz (ancak sadece sonuncusu kaldırmak istiyorsanız) o zaman rahatsız edilmeden bıraktığım “tembel olmayan” seçeneği en iyisidir. Hattaki verilerde veya sonda olursa ne olduğunu test etmedim.

<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> 

Bu yardımcı olur umarım!

İlgili konular