我使用Node.JS
从S3
存储桶中提取文件。那边的文件是gzipped
(gz
)。
我知道每个文件的内容都是由行组成的,其中每一行都是某个记录的JSON
,该记录未能放在Kinesis
上。
每个文件由大约12K个这样的记录组成。我希望能够在下载文件时处理这些记录。
如果文件不是gzipped
,则可以使用streams
和readline
模块轻松完成。因此,唯一阻止我这样做的是gunzip
过程,据我所知,它需要在整个文件上执行。
有没有办法把gunzipping
作为文件的一部分?
谢谢。
编辑1:(坏例子)
尝试@Mark Adler的建议:
const fileStream = s3.getObject(params).createReadStream();
const lineReader = readline.createInterface({input: fileStream});
lineReader.on('line', line => {
const gunzipped = zlib.gunzipSync(line);
console.log(gunzipped);
})
我得到以下错误:
错误:标头检查不正确在Zlib_handle.oneror(zlib.js:363:17)
是。node.js有一个完整的zlib接口,它允许您一次解压任意多的gzip文件。
解决上述问题的工作示例
以下解决了上述代码中的问题:
const fileStream = s3.getObject(params).createReadStream().pipe(zlib.createGunzip());
const lineReader = readline.createInterface({input: fileStream});
lineReader.on('line', gunzippedLine => {
console.log(gunzippedLine);
})