残念ながら、ノード lib で許可されているように、応答ストリームを unzip ジョブにパイプzlib
することはできません。キャッシュして、応答の最後を待つ必要があります。大きなファイルの場合は、応答をストリームにパイプすることをお勧めしfs
ます。そうしないと、メモリが瞬く間にいっぱいになってしまいます。
あなたがやろうとしていることを完全には理解していませんが、これが最善のアプローチです。本当に必要なときだけデータをメモリに保持してから、 csv パーサーにストリームする必要があります。
すべてのデータをメモリに保持したい場合は、csv パーサー メソッドfromPath
をfrom
、代わりにバッファーを受け取り、getData で直接返すメソッドに置き換えることができます。unzipped
AMDZip
の代わりに (@mihai が言ったように) を使用できますが、 npm でまだ公開されていないnode-zip
ため注意してください。AMDZip
$ npm install git://github.com/cthackers/adm-zip.git
注意: zip ファイルには 1 つのファイルしか含まれていません
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)
})
})