2014-05-16 20 views
5

मैं एक csv पार्सर को बदलने धाराओं की एक श्रृंखला के रूप में लागू है में स्ट्रीम बदलने की रचना करने के लिए:Node.js

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

मैं पार्सर (अपने स्वयं के मॉड्यूल में) अमूर्त करना चाहते हैं और करने में सक्षम हो कार्य करें:

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

जहां parser बस पहले से बदलने के लिए इस्तेमाल किया धाराओं की रचना है।

अगर मैं

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

तो parser buildObject() धारा के लिए निर्धारित है क्या करना है और केवल इस बदलाव धारा डेटा प्राप्त करता है।

अगर मैं

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

कर यह, या तो काम नहीं करता है के रूप में .pipe(process.stdout) 1 पर बुलाया जाएगा धारा को बदलने और 2 अन्य को नजरअंदाज कर दिया जाएगा।

धाराओं की एक सुंदर संरचना के लिए कोई सिफारिश?

उत्तर

7

दुर्भाग्यवश, ऐसा करने के लिए कोई अंतर्निहित तरीका नहीं है, लेकिन multipipe पैकेज अच्छा है। इस तरह उपयोग:

var multipipe = require('multipipe'); 

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

बिल्कुल मुझे क्या चाहिए। धन्यवाद। विश्वास नहीं कर सकता कि यह मॉड्यूल अधिक लोकप्रिय नहीं है ... –

+0

वही। ये जबरदस्त है। इसके अलावा, मल्टीपाइप का स्रोत कोड बहुत छोटा है, इसलिए हुड के नीचे देखने वाले किसी भी व्यक्ति के लिए कार्यान्वयन की जांच करना उचित है। – Owen

3

मैं इस मुद्दे के साथ संघर्ष कर रहा है (और कुछ अन्य!)। मैंने पाया highlandjs लगभग सभी मेरी समस्याओं का समाधान किया। इस मामले में उनके pipeline कमांड ने चाल की:

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