Node.js का उपयोग करके एक पाठ फ़ाइल पढ़ें?


124

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

node server.js file.txt

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


यदि आप अपने आप को कमांड लाइन पर अधिक विकल्प जोड़ते हुए पाते हैं, तो आप आशावादी का उपयोग कर सकते हैं ।
जेस

stackoverflow.com/questions/6156501/… एक पाठ फ़ाइल को पढ़ने के लिए एक और रास्ता दिखाता है
मार्क डर्डिन

जवाबों:


172

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

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

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

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


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

10
@fancy: कोशिश करें var lines = data.split(/\r?\n/);, फिर सरणी "लाइनों" में प्रत्येक पंक्ति होगी।
मैथिक्स

1
यदि पाठ फ़ाइल बड़ी है, तो यह एक अच्छा विचार नहीं है, क्योंकि यह सभी मेमोरी में पढ़ी जाएगी, यदि आप प्रक्रिया कहते हैं कि 1000mb CSV फ़ाइल को fs.createFilestream में देखें, तो आपको डेटा विभाजन के रूप में लाइन विभाजन के साथ देखभाल करने की आवश्यकता होगी अभ्यस्त (ज्यादातर मामलों में) लाइन की सीमाओं पर आते हैं (कुछ लोग पहले से ही समाधान के साथ आ गए हैं - Google)
MATtt Frëëman

1
@wtfcoder: हाँ, बहुत अच्छी बात है। मेरा इरादा केवल कमांड-लाइन पर नामित फ़ाइल को पढ़ने के सरल मामले को प्रदर्शित करना था; स्पष्ट रूप से कई सूक्ष्मताएं (esp। प्रदर्शन) हैं जो इस प्रश्न के दायरे से परे हैं।
मैरिक्स

मैंने एक बहुत बड़ी फ़ाइल को पार्स करने के लिए एक समान प्रश्न का हल पोस्ट किया, एक स्ट्रीम का उपयोग करके, सिंक्रोनस। देखें: stackoverflow.com/questions/16010915/…
गेरार्ड

35

नोड के साथ Usign करें।

var fs = require('fs');

try {  
    var data = fs.readFileSync('file.txt', 'utf8');
    console.log(data.toString());    
} catch(e) {
    console.log('Error:', e.stack);
}

ध्यान दें कि यह तुल्यकालिक संस्करण है।
रिच वर्डन

@RichWerden इस संदर्भ में "सिंक्रोनस" से आपका क्या अभिप्राय है?
जसन

1
नोड में जब कुछ "सिंक्रोनस" होता है तो यह सिस्टम को कुछ और करने से रोकता / रोकता है। मान लें कि आपके पास एक नोड वेबसर्वर है - यदि ऊपर हो रहे समय में कोई अन्य अनुरोध आता है, तो सर्वर फ़ाइल को पढ़ने में व्यस्त होने के कारण प्रतिक्रिया नहीं देगा / नहीं कर सकता है।
रिच वेर्डन

27

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

टेक्स्ट फाइल को पढ़ने का सबसे आसान तरीका है कि आप इसे लाइन से पढ़ें। मैं एक बफ़रडियर की सलाह देता हूं :

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 ();

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


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

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

13
मैं देख रहा हूँ कि बफ़रडेडर अब पदावनत हो गया है।
बजे मार्क रोचाइंड

6

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

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.');
    })
);

5

मैं एक पूर्ण उदाहरण पोस्ट कर रहा हूं जो आखिरकार मुझे काम मिल गया। यहां मैं 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);
});
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.