दुर्भाग्य से आप कर सकते हैं नहीं पाइप unzip काम नोड के रूप में zlib
lib आप आप कैश और प्रतिक्रिया के अंत इंतजार करना करने के लिए, की अनुमति देता है में प्रतिक्रिया स्ट्रीम। मेरा सुझाव है कि आप बड़ी फ़ाइलों के मामले में fs
स्ट्रीम के जवाब को पाइप करने के लिए सुझाव दें, अन्यथा आप अपनी याददाश्त को एक झपकी में भर देंगे!
मैं पूरी तरह से समझ नहीं पा रहा हूं कि आप क्या करने की कोशिश कर रहे हैं, लेकिन imho यह सर्वोत्तम दृष्टिकोण है। आपको अपना डेटा केवल स्मृति में रखें जब आपको वास्तव में इसकी आवश्यकता हो,, और फिर csv parser पर स्ट्रीम करें।
आप अपने सभी डेटा स्मृति में आप from
कि एक बफर के बजाय लेता है के साथ और GetData बदले में सीएसवी पार्सर विधि fromPath
जगह ले सकता है सीधे unzipped
आप उपयोग कर सकते हैं रखना चाहते हैं AMDZip
(के रूप में @mihai कहा) के बजाय node-zip
, बस ध्यान क्योंकि AMDZip
अभी तक NPM में प्रकाशित नहीं किया गया है भुगतान ताकि आप की जरूरत है:
$ npm install git://github.com/cthackers/adm-zip.git
एनबी धारणा: ज़िप फ़ाइल में शामिल है केवल एक फ़ाइल
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)
})
})
ध्यान दें कि 'zlib' ज़िप फ़ाइल प्रारूप को संभाल नहीं करता है, यह केवल gzip को नियंत्रित करता है और स्वरूपों को डिफ्लेट करता है। 'Zlib.unzip' फ़ंक्शन को भ्रामक रूप से नामित किया गया है क्योंकि यह केवल gzip को डीकंप्रेस करता है और स्वरूपों को डिफ्लेट करता है। आपको एक ज़िप प्रारूप पुस्तकालय की आवश्यकता है। –
यह ज़िप्फाइल आशाजनक दिखता है https://github.com/springmeyer/node-zipfile/blob/master/README.md –
@Dan: असल में, zlib भी ['zlib' प्रारूप] को नियंत्रित करता है (http: //www.ietf .org/rfc/rfc1950.txt) (जो बदले में डिफ्लेट का उपयोग करता है)। लेकिन यह यहां पूरी तरह से अप्रासंगिक है, इसलिए +1 :-) – Cameron