遗憾的是,您无法将响应流通过管道传输到解压缩作业中,因为节点zlib
库允许您这样做,您必须缓存并等待响应结束。我建议你fs
在大文件的情况下将响应通过管道传输到流,否则你会在眨眼间填满你的记忆!
我不完全理解你想要做什么,但恕我直言,这是最好的方法。您应该只在真正需要时才将数据保存在内存中,然后传输到csv 解析器。
如果您想将所有数据保存在内存中,您可以将 csv 解析器方法替换为采用缓冲区的方法fromPath
,from
并在 getData 中直接返回unzipped
您可以使用AMDZip
(如@mihai 所说)代替node-zip
,只需注意,因为AMDZip
尚未在 npm 中发布,因此您需要:
$ npm install git://github.com/cthackers/adm-zip.git
NB 假设:zip 文件只包含一个文件
var request = require('request'),
fs = require('fs'),
csv = require('csv')
NodeZip = require('node-zip')
function getData(tmpFolder, url, callback) {
var tempZipFilePath = tmpFolder + new Date().getTime() + Math.random()
var tempZipFileStream = fs.createWriteStream(tempZipFilePath)
request.get({
url: url,
encoding: null
}).on('end', function() {
fs.readFile(tempZipFilePath, 'base64', function (err, zipContent) {
var zip = new NodeZip(zipContent, { base64: true })
Object.keys(zip.files).forEach(function (filename) {
var tempFilePath = tmpFolder + new Date().getTime() + Math.random()
var unzipped = zip.files[filename].data
fs.writeFile(tempFilePath, unzipped, function (err) {
callback(err, tempFilePath)
})
})
})
}).pipe(tempZipFileStream)
}
getData('/tmp/', 'http://bdn-ak.bloomberg.com/precanned/Comdty_Calendar_Spread_Option_20120428.txt.zip', function (err, path) {
if (err) {
return console.error('error: %s' + err.message)
}
var metadata = []
csv().fromPath(path, {
delimiter: '|',
columns: true
}).transform(function (data){
// do things with your data
if (data.NAME[0] === '#') {
metadata.push(data.NAME)
} else {
return data
}
}).on('data', function (data, index) {
console.log('#%d %s', index, JSON.stringify(data, null, ' '))
}).on('end',function (count) {
console.log('Metadata: %s', JSON.stringify(metadata, null, ' '))
console.log('Number of lines: %d', count)
}).on('error', function (error) {
console.error('csv parsing error: %s', error.message)
})
})