2013-08-26 7 views
7

Ich versuche, eine Textdatei asynchron und Zeile für Zeile unter Node.js zu lesen. Ich habe den folgenden Code Coffee:Node.js readline fehlt letzte Zeile der Datei?

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 

Es funktioniert gut, mit Ausnahme der letzten Zeile der Dateien wird nie berichtet, es sei denn es durch eine neue Zeile beendet. Gibt es eine Möglichkeit, dies zu beheben (außer natürlich, den Zeilenumbruch manuell hinzuzufügen)?

+0

einfache Lösung, wenn Dateien nicht zu groß sind: vielleicht einfach 'readFile' verwenden und auf' \ n' aufteilen? – WiredPrairie

+0

Ja, das ist definitiv nicht, was Readline ist. Sie würden readline verwenden, wenn Sie eine Shell oder eine REPL erstellen, nicht zum Lesen einer Datei. Sie wollen das 'fs'-Modul: http://nodejs.org/api/fs.html –

+0

Ihr Kommentar scheint mir sowohl korrekt als auch technisch strittig zu sein - schließlich geht es beim" Hacken "nur darum, sich Werkzeuge anzueignen, wo es angebracht ist. Genauer gesagt: Die Streams-Abstraktion sagt Ihnen, dass Sie nicht so viele Dateien, http-Anfragen und stdin-Tastaturereignisse anzeigen sollen, sondern "Datenströme". Das heißt, wenn readline keine Möglichkeit hat, "dangling bits" zu kommunizieren (vor einer newline, aber nachdem der Eingabestream beendet ist), dann ist es die * API *, nicht der * beabsichtigte Zweck *, der diese Bibliothek schlecht macht fit für die anstehende Aufgabe. – flow

Antwort

1

Sie sollten hierfür das Modul fs verwenden und den Dateiinhalt auf \n Zeichen aufteilen, um festzustellen, wo die Zeilen enden.

+4

Dateiinhalt lesen? Was ist, wenn die Dateigröße 50G und der Arbeitsspeicher 4G beträgt? – ecdeveloper