2014-05-16 15 views
5

Tôi có một phân tích cú pháp csv thực hiện như một loạt các thay đổi dòng:Làm thế nào để chuyển đổi soạn Streams trong Node.js

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

Tôi muốn trừu tượng phân tích cú pháp (trong mô-đun riêng của mình) và có thể làm:

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

nơi parser chỉ là thành phần của các dòng trước đây sử dụng biến đổi.

Nếu tôi làm

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

sau đó parser được thiết lập để dòng buildObject() và chỉ dòng chuyển đổi này sẽ nhận dữ liệu.

Nếu tôi làm

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

nó không hoạt động, hoặc, như .pipe(process.stdout) sẽ được gọi vào ngày 1 đổi dòng và 2 người khác sẽ được bỏ qua.

Bất kỳ đề xuất nào cho thành phần thanh lịch của luồng?

Trả lời

7

Thật không may, không có cách tích hợp để làm điều đó, nhưng có gói multipipe mát mẻ. Sử dụng như sau:

var multipipe = require('multipipe'); 

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

Chính xác những gì tôi cần. Cảm ơn. Không thể tin rằng mô-đun này không phổ biến hơn ... –

+0

Tương tự. Điều này thật tuyệt vời. Ngoài ra, mã nguồn của nhiều người rất ngắn, vì vậy đáng để kiểm tra việc triển khai cho bất kỳ ai coi trọng giao diện người dùng. – Owen

3

Tôi đã đấu tranh với vấn đề này (và một số vấn đề khác!). Tôi đã tìm thấy highlandjs giải quyết gần như tất cả các vấn đề của tôi. Trong trường hợp này, lệnh pipeline của bạn đã thực hiện thủ thuật:

var h = require('highland'); 
var parser = h.pipeline(iconv.decodeStream('win1252'), csv.parse(), buildObject()); 
Các vấn đề liên quan