2016-06-28 21 views
5

Ho un file gzip compresso che vorrei leggere riga per riga.Leggi gzip stream riga per riga

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'); 
    }); 

Credo che ho bisogno di impostare un chunksize per zlib.createGunzip che ho letto solo fino al successivo \n. Ma come determinarlo in modo dinamico?

risposta

12

Potrebbe essere più facile da usare readline per questo:

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

Che dire se voglio ruscello decompresso formare un'altra funzione invece di decomprimere file locale? Ottengo alcuni errori strani provenienti dal file readline.js. – Tomas

+0

@Tomas vuoi dire che vuoi elaborare un flusso "normale" (non uno gzip)? Puoi usare qualsiasi flusso leggibile come argomento per 'input'. – robertklep

+0

Sto provando a utilizzare un flusso proveniente da zlib.gunzip(). il mio flusso di lavoro è: ricevo il file da aws s3, lo decomprimo usando gunzip, poi passo lo stream a readline ma mi sta mandando degli errori, potrebbe essere che il flusso sia incoerente o qualcosa del genere? – Tomas