2014-04-04 13 views
6

Aktualnie pracuję z node.js, aby utworzyć bota IRC. Bot pozwala użytkownikom dodawać linki do utworów do bazy danych. Za każdym razem ktoś twierdzi, utwór, jest on dodawany do nowej linii „shuffle.txt” jako takie:Znajdź ciąg w pliku Txt, Usuń całą linię

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

Zauważ, że niektóre informacje user1 literówka w swoim najnowszym dodatkiem. Próbuję wykonać polecenie UNDO, aby użytkownik mógł usunąć ostatnio wprowadzoną linię. Planuję to zrobić, znajdując najnowsze pojawienie się ich nazwy w shuffle.txt i usuwając całą linię, na której się znajduje. Oto moja wiadomość słuchacz:

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 
      } 

    } 
}); 

wprowadzając komendę użytkownik jest przechowywana jako from

Jestem zakładając, będę musiał zrobić coś na wzór tego:

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 "Jestem nowy w JavaScript i to jest mój pierwszy raz przy użyciu pliku node.js, więc mogę skorzystać z każdej pomocy, jaką mogę uzyskać! Dziękuję wszystkim.

EDYCJA: Należy również zwrócić uwagę, że nie potrzebuję pomocy w rozpoznawaniu poleceń. Potrzebuję tylko pomocy w znalezieniu/usunięciu części. Twoje zdrowie!

Odpowiedz

2

Edycja 2: edytowane za pomocą nowego rozwiązania.

Można spróbować to:

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

}); 

plik podzielony na linie, znajdź ostatnią linię z prostym pętla idzie do tyłu, usunąć wiersz używając delete, potem łatać ją z powrotem razem.

demo

Ponadto, nie należy używać readFileSync w węźle, jak blokowanie węzeł może być niebezpieczne, ponieważ jest to pojedynczy gwintowany.

+0

Dzięki za szybką reakcję! Jedyny problem, który tu widzę, to kod znajdujący OSTATNIĄ wystąpienie "user1" lub pierwszego? Jeśli usuniemy pierwsze wystąpienie, zamiast tego usuwam ich najstarsze zgłoszenie, a nie najnowsze. Jeszcze raz dziękuję! – Santi

+0

Tak, tak, na nim – Mosho

+0

Jeez jesteś szybki, pomoc jest bardzo doceniona. Niestety pracuję nad tym botem od 3PM i jest teraz 5:23, muszę się trochę przespać. Sprawdzę jutro, aby poinformować Cię, jak to działa! Pozdrawiam! – Santi

1

To wydaje się działać dobrze. Jest on samowystarczalny, więc możesz po prostu wkleić go do pliku HTML, aby zobaczyć, jak działa. Zasadniczo uruchom regularne wyrażenie, aby pasowało do całej linii zaczynającej się od podanej nazwy użytkownika. Cała linia jest zwracana ("gm" część wyrażenia regularnego mówi, aby dopasować linię na raz) jako ciąg znaków.

Następnie wystarczy zastąpić ten zwrócony wiersz (jako ciąg) w obrębie danych. Należy zauważyć, że zakłada to, że wiersz jest unikalny w pliku tekstowym. Jeśli sądzisz, że ludzie mogli wejść kilka razy w tę samą linię (ale chcesz tylko usunąć ostatnią), to opcja "nie leniwy", którą zostawiłem odkomentowany, jest najlepsza. Nie testowałem, co się stanie, jeśli linia jest pierwsza w danych lub na końcu.

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

mam nadzieję, że to pomoże!

Powiązane problemy