2016-06-28 19 views
5

Tôi đã có một tệp nén gzip mà tôi muốn đọc từng dòng một.Đọc dòng suối gzip theo dòng

var fs = require('fs') 
var zlib = require('zlib') 
var gunzip = zlib.createGunzip() 
var inp = fs.createReadStream('test.gz') 
var n = 0 

var lineProcessing = function (err, data) { 
    if (!err) { 
     n += 1 
     console.log ("line: " + n) 
     console.log (data.toString()) 
    } 
} 

inp 
    .on('data', function (chunk) { 
     zlib.gunzip (chunk, lineProcessing) 
    }) 
    .on('end', function() { 
    console.log ('ende'); 
    }); 

Tôi đoán tôi cần phải thiết lập một chunksize cho zlib.createGunzip rằng tôi chỉ đọc cho đến khi tới \n. Nhưng làm thế nào để xác định nó một cách năng động?

Trả lời

12

Nó có thể được dễ dàng hơn để sử dụng readline cho việc này:

const fs  = require('fs'); 
const zlib  = require('zlib'); 
const readline = require('readline'); 

let lineReader = readline.createInterface({ 
    input: fs.createReadStream('test.gz').pipe(zlib.createGunzip()) 
}); 

let n = 0; 
lineReader.on('line', (line) => { 
    n += 1 
    console.log("line: " + n); 
    console.log(line); 
}); 
+0

gì về nếu tôi muốn dòng suối đã được giải nén thành chức năng khác thay vì giải nén tập tin địa phương? Tôi nhận được một số lỗi lạ xuất phát từ tệp readline.js .. – Tomas

+0

@Tomas có phải bạn muốn xử lý luồng "thông thường" (không phải là tệp được nén) không? Bạn có thể sử dụng bất kỳ luồng có thể đọc nào làm đối số cho 'đầu vào'. – robertklep

+0

Tôi đang cố gắng sử dụng luồng đến từ zlib.gunzip(). luồng công việc của tôi là: Tôi nhận được tệp từ aws s3, giải nén nó bằng cách sử dụng gunzip, sau đó chuyển luồng tới readline nhưng nó ném cho tôi lỗi, có thể luồng đó không nhất quán hay gì đó không? – Tomas

Các vấn đề liên quan