2014-05-16 18 views
5

ho un parser CSV implementato come una serie di flussi di trasformare:Come comporre trasformare gli stream in node.js

process.stdin 
    .pipe(iconv.decodeStream('win1252')) 
    .pipe(csv.parse()) 
    .pipe(buildObject()) 
    .pipe(process.stdout); 

mi piacerebbe astrarre il parser (nel suo modulo) ed essere in grado di fare:

process.stdin. 
    .pipe(parser) 
    .pipe(process.stdout); 

dove parser è solo la composizione dei flussi utilizzati in precedenza trasformare.

Se faccio

var parser = iconv.decodeStream('win1252') 
    .pipe(csv.parse()) 
    .pipe(buildObject()); 

poi parser è impostato al flusso buildObject() e solo questo flusso trasformazione riceve i dati.

Se faccio

var parser = iconv.decodeStream('win1252'); 
parser 
    .pipe(csv.parse()) 
    .pipe(buildObject()); 

non funziona o, come .pipe(process.stdout) saranno chiamati al 1 ° trasformare torrente e gli altri 2 saranno bypassati.

Qualche raccomandazione per un'elegante composizione di flussi?

risposta

7

Sfortunatamente, non esiste un modo integrato per farlo, ma c'è un bel pacchetto multipipe. Usa come questo:

var multipipe = require('multipipe'); 

var parser = multipipe(iconv.decodeStream('win1252'), csv.parse(), buildObject()); 
+0

Esattamente quello che ho bisogno. Grazie. Non posso credere che questo modulo non sia più popolare ... –

+0

Same. È brillante. Inoltre, il codice sorgente di multipipe è molto breve, quindi vale la pena verificare l'implementazione per chiunque apprezzi un look sotto il cofano. – Owen

3

mi è stato alle prese con questo problema (e alcuni altri!). Ho trovato highlandjs risolto quasi tutti i miei problemi. In questo caso il loro comando pipeline ha fatto il trucco:

var h = require('highland'); 
var parser = h.pipeline(iconv.decodeStream('win1252'), csv.parse(), buildObject()); 
Problemi correlati