2016-03-22 3 views
0

Angenommen, ich habe eine Datei mit einer Liste von ganzen Zahlen, eine pro Zeile. Ich verwende fs.createReadStream und pipe das in split (so dass jeder Chunk eine ganze Zahl ist). Dann piped ich das in einen Duplex-Strom, der die Zahlen hinzufügen soll, und schreibe die Summe durch Piping in fs.createWriteStream.warten Sie, bis der vorherige Stream leer ist, bevor Sie lesen können

var fs = require('fs'); 
var stream = require('stream'); 
var split = require('split'); 

var addIntegers = new stream.Duplex(); 

addIntegers.sum = 0; 

addIntegers._read = function(size) { 
    this.push(this.sum + '\n'); 
} 

addIntegers._write = function(chunk, encoding, done) { 
    this.sum += +chunk; 
    done(); 
} 

fs.createReadStream('list-of-integers.txt') 
    .pipe(split()) 
    .pipe(addIntegers) 
    .pipe(fs.createWriteStream('sum.txt')); 

Als ich dies ausführen, wird mit Nullen und das Programm nie beendet sum.txt nur ständig gefüllt (wie erwartet). Wie warte ich darauf, dass der Eingabestrom (split) leer ist, bevor der Ausgabestrom (fs.createWriteStream) von addIntegers gelesen werden kann?

+1

Warum nicht 'push()' 'innen _write()' statt? – mscdex

+0

Hmm ja, ich könnte einen Transformations-Stream verwenden und 'this.push (this.sum + '\ n')' in '_write'. Ich bekomme eine laufende Summe, die für immer viel besser ist als Nullen. Gibt es jedoch eine Möglichkeit, die Gesamtsumme zu bekommen? (einmal in 'sum.txt' statt n mal schreiben?). Ich weiß, dass ich hinterher nur 'sum.txt' schreiben kann, aber ich habe mich gefragt, ob es eine idiomatische' Knoten'-Methode gibt, um zu bekommen, was ich will. – aeoliant

Antwort

0

Ich fand es heraus.

Ich entschied mich stattdessen einen Transform Stream zu verwenden (danke mscdex), weil es eine Methode (_flush) hat, die aufgerufen wird, nachdem alle geschriebenen Daten verbraucht sind. Der Arbeitscode ist unten. Vergessen Sie nicht, npm i split :)

var fs = require('fs'); 
var stream = require('stream'); 
var split = require('split'); 

var addIntegers = new stream.Transform(); 

addIntegers.sum = 0; 

addIntegers._transform = function(chunk, encoding, done) { 
    this.sum += +chunk; 
    done(); 
} 

addIntegers._flush = function(done) { 
    this.push(this.sum + '\n'); 
} 

fs.createReadStream('list-of-integers.txt') 
    .pipe(split()) 
    .pipe(addIntegers) 
    .pipe(fs.createWriteStream('sum.txt')); 
Verwandte Themen