2016-06-28 45 views
5

ile okuyun. Satır satırını okumak istediğim sıkıştırılmış bir gzip dosyası var.Gzip akış hattını satır

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

Ben yalnızca önümüzdeki \n kadar okumak zlib.createGunzip için ChunkSize ayarlamanız gerekir sanırım. Ama dinamik olarak nasıl belirlenir?

cevap

12

Bunun için readline kullanmak daha kolay olabilir:

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

Ne Çýkartýlan akışı başka bir fonksiyon oluşturur yerine yerel Sıkıştırılmış dosyayı çıkarttıktan akışı istiyorsanız ne olacak? Readline.js dosyasından gelen bazı garip hatalar alıyorum .. – Tomas

+0

@Tomas "düzenli" akışı (gzipli değil) işlemek istediğiniz anlamına mı geliyor? Herhangi bir okunabilir akışı "input" için argüman olarak kullanabilirsiniz. – robertklep

+0

zlib.gunzip() kaynağından bir akış kullanmaya çalışıyorum. iş akışım: aws s3'ten dosya alıyorum, bunu gunzip kullanarak açın, sonra akışı akış çizgisine aktarın ama bana hata atıyor, bu akımın tutarsız mı yoksa bir şey mi olabilir? – Tomas