2012-02-06 18 views
65

मुझे टर्मिनल में एक टेक्स्ट फ़ाइल में पास करने की आवश्यकता है और उसके बाद डेटा पढ़ना है, मैं यह कैसे कर सकता हूं?Node.js का उपयोग कर एक टेक्स्ट फ़ाइल पढ़ें?

node server.js file.txt 

मैं टर्मिनल से पथ में कैसे पास करूं, मैं दूसरी तरफ इसे कैसे पढ़ूं?

+0

आप पाते हैं अपने आप को कमांड लाइन पर और अधिक विकल्प जोड़ने, तो आप उपयोग कर सकते हैं [आशावादी] (https://github.com/substack/node-optimist)। – Jess

+0

http://stackoverflow.com/questions/6156501/read-a-file-one-line-at-a-time-in-node-js?rq=1 टेक्स्ट फ़ाइल पढ़ने के लिए एक और तरीका दिखाता है –

उत्तर

111

फ़ाइल पढ़ने के लिए फ़ाइल नाम और FileSystem module (fs) प्राप्त करने के लिए आप कमांड लाइन तर्कों तक पहुंचने के लिए process.argv सरणी का उपयोग करना चाहेंगे। उदाहरण के लिए:

// Make sure we got a filename on the command line. 
if (process.argv.length < 3) { 
    console.log('Usage: node ' + process.argv[1] + ' FILENAME'); 
    process.exit(1); 
} 
// Read the file and print its contents. 
var fs = require('fs') 
    , filename = process.argv[2]; 
fs.readFile(filename, 'utf8', function(err, data) { 
    if (err) throw err; 
    console.log('OK: ' + filename); 
    console.log(data) 
}); 

कि नीचे के लिए आप process.argv लंबाई दो, zeroth आइटम "नोड" दुभाषिया और पहले किया जा रहा है की जा रही स्क्रिप्ट उस नोड वर्तमान में चल रहे थे, उसके बाद आइटम आमतौर पर होगा एक छोटे से तोड़ने के लिए कमांड लाइन पर पारित किया गया। एक बार जब आप argv से फ़ाइल नाम खींच लेते हैं तो आप फ़ाइल को पढ़ने के लिए फाइल सिस्टम फ़ंक्शंस का उपयोग कर सकते हैं और जो कुछ भी आप अपनी सामग्री के साथ करना चाहते हैं। नमूना उपयोग इस प्रकार दिखाई देगा:

$ node ./cat.js file.txt 
OK: file.txt 
This is file.txt! 

[संपादित करें] रूप @wtfcoder, का उल्लेख है "fs.readFile()" पद्धति का उपयोग करके सबसे अच्छा विचार नहीं हो सकता है क्योंकि यह करने के लिए यह उपज से पहले फ़ाइल की संपूर्ण सामग्री बफ़र होगा कॉलबैक फ़ंक्शन। यह बफरिंग संभावित रूप से बहुत सारी मेमोरी का उपयोग कर सकता है, लेकिन अधिक महत्वपूर्ण बात यह है कि यह node.js की मूल विशेषताओं में से एक का लाभ नहीं लेता है - एसिंक्रोनस, इवेंट I/O।

एक बड़ी फ़ाइल (या किसी भी फ़ाइल, वास्तव में) को संसाधित करने के लिए "नोड" तरीका fs.read() का उपयोग करना होगा और प्रत्येक उपलब्ध खंड को संसाधित करना होगा क्योंकि यह ऑपरेटिंग सिस्टम से उपलब्ध है। हालांकि, फ़ाइल को पढ़ने के लिए आपको फ़ाइल की अपनी (संभवतः) वृद्धिशील पार्सिंग/प्रसंस्करण करने की आवश्यकता होती है और कुछ बफरिंग अनिवार्य हो सकती है।

+0

बहुत बढ़िया, धन्यवाद बहुत, बहुत उपयोगी है। मैं इस डेटा को लाइन से कैसे विभाजित कर सकता हूं? – fancy

+5

@fancy: 'var lines = data.split (/ \ r? \ N /);', फिर सरणी "पंक्तियों" में प्रत्येक पंक्ति होगी। – maerics

+0

अच्छा, हाँ मैंने वापस जांचने से पहले ऐसा किया, धन्यवाद फिर से !! – fancy

20

आईएमएचओ, fs.readFile() से बचा जाना चाहिए क्योंकि यह स्मृति में सभी फाइल लोड करता है और जब तक कि सभी फाइलें पढ़ी नहीं जाती हैं तब तक कॉलबैक को कॉल नहीं किया जाएगा।

टेक्स्ट फ़ाइल पढ़ने का सबसे आसान तरीका यह लाइन को लाइन से पढ़ना है। .properties या json फ़ाइलें आप एक पार्सर उपयोग करने की आवश्यकता की तरह जटिल डेटा संरचनाओं के लिए

new BufferedReader ("file", { encoding: "utf8" }) 
    .on ("error", function (error){ 
     console.log ("error: " + error); 
    }) 
    .on ("line", function (line){ 
     console.log ("line: " + line); 
    }) 
    .on ("end", function(){ 
     console.log ("EOF"); 
    }) 
    .read(); 

(आंतरिक रूप से यह भी एक बफ़र पाठक का उपयोग करना चाहिए): मैं एक BufferedReader सलाह देते हैं।

+6

इस तकनीक को इंगित करने के लिए धन्यवाद। आप सही हैं कि यह सबसे अच्छा तरीका हो सकता है, लेकिन मैंने सोचा कि यह इस प्रश्न के संदर्भ में थोड़ा उलझन में था, जो मुझे लगता है कि एक अनावश्यक उपयोग-मामले के बारे में पूछ रहा है। जैसा ऊपर बताया गया है, अगर यह एक छोटी सी फ़ाइल को कमांड लाइन उपकरण में पास किया जा रहा है, तो 'fs.readFile()' या 'fs.readFileSync() 'का उपयोग न करने का कोई कारण नहीं है। एक उल्लेखनीय प्रतीक्षा करने के लिए यह एक बड़ी फाइल होनी चाहिए। पैकेज.जेसन जैसी एक JSON कॉन्फ़िगरेशन फ़ाइल 1 केबी से कम होने की संभावना है, इसलिए आप केवल 'fs.readFile()' और 'JSON.parse()' कर सकते हैं। –

+0

BufferedReader ने अपना हस्ताक्षर बदल दिया होगा। मुझे BufferedReader को BufferedReader, DataReader के साथ प्रतिस्थापित करना पड़ा, जहां BufferedReader मॉड्यूल था। Https://github.com/Gagle/Node-BufferedReader – bnieland

+6

देखें मुझे लगता है कि BufferedReader अब बहिष्कृत है। –

1

आप फ़ाइल लाइन को पढ़ने के लिए रीडस्ट्रीम और पाइप का उपयोग कर सकते हैं बिना किसी फ़ाइल को सभी फ़ाइलों को एक बार स्मृति में पढ़े।

var fs = require('fs'), 
    es = require('event-stream'), 
    os = require('os'); 

var s = fs.createReadStream(path) 
    .pipe(es.split()) 
    .pipe(es.mapSync(function(line) { 
     //pause the readstream 
     s.pause(); 
     console.log("line:", line); 
     s.resume(); 
    }) 
    .on('error', function(err) { 
     console.log('Error:', err); 
    }) 
    .on('end', function() { 
     console.log('Finish reading.'); 
    }) 
); 
1

मैं एक पूर्ण उदाहरण पोस्ट कर रहा हूं जिसे मैं अंततः काम कर रहा हूं। यहाँ मैं एक स्क्रिप्ट से एक फ़ाइल rooms/rooms.txt में पढ़ रहा हूँ rooms/rooms.js

var fs = require('fs'); 
var path = require('path'); 
var readStream = fs.createReadStream(path.join(__dirname, '../rooms') + '/rooms.txt', 'utf8'); 
let data = '' 
readStream.on('data', function(chunk) { 
    data += chunk; 
}).on('end', function() { 
    console.log(data); 
}); 
संबंधित मुद्दे