2013-08-26 12 views
7

Próbuję odczytać plik tekstowy asynchronicznie i wiersz po wierszu pod Node.js. Mam następujący kod coffeescript:Node.js readline brakuje ostatniej linii pliku?

readline = require 'readline' 
fs  = require 'fs' 

#-------------------------------------------------------------------- 
lines_of = (route, handler) -> 
    #.................................................................. 
    stream = readline.createInterface 
    input: fs.createReadStream route 
    output: process.stdout 
    terminal: false 
    #.................................................................. 
    stream.on 'close', -> 
    handler null, null 
    #.................................................................. 
    stream.on 'error', (error) -> 
    handler error 
    #.................................................................. 
    stream.on 'line', (line) -> 
    handler null, line 

Współpracuje z wyjątkiem ostatniej linii plików nigdy nie jest zgłaszanych, o ile nie jest zakończony znakiem nowej linii. czy jest jakiś sposób, aby temu zaradzić (z wyjątkiem oczywiście ręcznego dodawania nowej linii)?

+0

proste rozwiązanie, jeśli pliki nie są zbyt duże: może po prostu użyj 'readFile' i podziel na' \ n'? – WiredPrairie

+0

Tak, to zdecydowanie nie jest to, do czego służy readline. Używałbyś readline, jeśli tworzyłeś powłokę lub REPL, a nie do czytania pliku. Chcesz moduł 'fs': http://nodejs.org/api/fs.html –

+0

Twój komentarz uderza mnie jako będący poprawnym i technicznie spornym - w końcu" hakowanie "polega na przywłaszczaniu narzędzi tam, gdzie jest to właściwe. bardziej do rzeczy: abstrakcja strumieni pozwala wyświetlić nie tyle pliki, żądania HTTP i zdarzenia klawiatury stdin, ale "strumienie danych". to powiedziawszy, jeśli readline nie ma sposobu na przekazanie "zwisających bitów" (przed znakiem nowej linii, ale po zakończeniu strumienia wejściowego), to jest to jego * API *, a nie jego * zamierzony cel *, który czyni tę bibliotekę złym odpowiedni do danego zadania. – flow

Odpowiedz

1

Należy użyć do tego modułu fs i podzielić zawartość pliku na znaki \n, aby ustalić, gdzie kończy się linia.

+4

Czytanie zawartości pliku? Co się stanie, jeśli rozmiar pliku to 50G, a pamięć RAM to 4G? – ecdeveloper

Powiązane problemy