নোড.জেএস ব্যবহার করে একটি পাঠ্য ফাইল পড়বেন?


124

আমাকে টার্মিনালে একটি পাঠ্য ফাইলটি পাস করতে হবে এবং তার থেকে ডেটাটি পড়তে হবে, আমি এটি কীভাবে করব?

node server.js file.txt

টার্মিনাল থেকে আমি কীভাবে পাস করব, অন্যদিকে কীভাবে পড়ব?


আপনি যদি কমান্ড লাইনে নিজেকে আরও বিকল্প যুক্ত করতে দেখেন তবে আপনি অপটিমটিস্ট ব্যবহার করতে পারেন ।
জেস

stackoverflow.com/questions/6156501/… একটি পাঠ্য ফাইল পড়ার অন্য একটি উপায় দেখায়
মার্ক ডুরডিন

উত্তর:


172

আপনি process.argvফাইলের নাম পেতে ফাইল নাম এবং ফাইল সিস্টেম মডিউল (fs) পেতে কমান্ড-লাইন আর্গুমেন্ট অ্যাক্সেস করতে অ্যারে ব্যবহার করতে চাইবেন । উদাহরণ স্বরূপ:

// 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সাধারণত দৈর্ঘ্য দুটি হবে, জেরোথ আইটেমটি হ'ল "নোড" ইন্টারপ্রেটার এবং প্রথমটি স্ক্রিপ্ট যা নোড বর্তমানে চলছে, তার পরে আইটেমগুলি কমান্ড লাইনে পাস করা হয়েছিল। আপনি আরগভি থেকে কোনও ফাইলের নাম টানলে আপনি ফাইলটি পড়ার জন্য ফাইল সিস্টেমের ফাংশনগুলি ব্যবহার করতে পারেন এবং এর বিষয়বস্তুগুলির সাথে যা চান তা করতে পারেন। নমুনা ব্যবহার এইরকম দেখাবে:

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

[সম্পাদনা] @ wtfcoder হিসাবে উল্লেখ করা হয়েছে, " fs.readFile()" পদ্ধতিটি ব্যবহার করা সেরা ধারণা নাও হতে পারে কারণ এটি কলব্যাক ফাংশনে ফল দেওয়ার আগে ফাইলের পুরো বিষয়বস্তুগুলিকে বাফার করবে। এই বাফারিংটি সম্ভবত প্রচুর পরিমাণে মেমরি ব্যবহার করতে পারে তবে আরও গুরুত্বপূর্ণ, এটি নোড.জেএস এর মূল বৈশিষ্ট্যগুলির একটি - অ্যাসিনক্রোনাস, বিভক্ত আই / ও এর সুবিধা গ্রহণ করে না।

fs.read()অপারেটিং সিস্টেম থেকে উপলব্ধ হিসাবে উপলব্ধ একটি বৃহত ফাইল (বা যে কোনও ফাইল, সত্যিই) প্রসেস করার "নোড" উপায়টি হ'ল প্রতিটি উপলব্ধ অংশটি ব্যবহার এবং প্রক্রিয়া করা। তবে ফাইলটি পড়ার জন্য আপনার নিজের (সম্ভবত) ইনক্রিমেন্টাল পার্সিং / ফাইলের প্রসেসিং এবং কিছু পরিমাণ বাফারিং অনিবার্য হতে পারে।


দুর্দান্ত, অনেক অনেক ধন্যবাদ। আমি কীভাবে এই তথ্যটি লাইন দিয়ে বিভক্ত করতে পারি?
অভিনব

10
@ অভিনব: চেষ্টা করুন var lines = data.split(/\r?\n/);, তারপরে অ্যারে "লাইনগুলি" প্রতিটি লাইন থাকবে।
maerics

1
পাঠ্য ফাইলটি যদি বড় হয় তবে এটি মেমরির মধ্যে পড়তে হবে, এটি একটি ভাল ধারণা নয়, যদি আপনি fs.createFilestream এ 1000mb সিএসভি ফাইলটি প্রসেস করেন তবে আপনাকে লাইন বিভাজনের সাথে যত্ন নিতে হবে যদিও ডেটা খণ্ড হিসাবে অদম্য (বেশিরভাগ ক্ষেত্রে) লাইন সীমানায় পড়ে (কিছু লোক ইতিমধ্যে সমাধান নিয়ে এসেছে - গুগল)
ম্যাট ফ্রিম্যান

1
@ wtfcoder: হ্যাঁ, খুব ভাল পয়েন্ট। আমার উদ্দেশ্যটি কেবল কমান্ড-লাইনে নামক একটি ফাইল পড়ার সহজ ঘটনাটি প্রদর্শন করা ছিল; স্পষ্টতই অনেক সূক্ষ্মতা রয়েছে (উদাহরণস্বরূপ কর্মক্ষমতা) যা এই প্রশ্নের ক্ষেত্রের বাইরে।
maerics

খুব বড় ফাইল পার্সিংয়ের জন্য একই ধরণের প্রশ্নের সমাধান আমি একটি স্ট্রিম, সিঙ্ক্রোনাস ব্যবহার করে পোস্ট করেছি। দেখুন: স্ট্যাকওভারফ্লো.com
জেরার্ড

35

নোডের সাথে এফএস স্থাপন করুন।

var fs = require('fs');

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

মনে রাখবেন এটি সিঙ্ক্রোনাস সংস্করণ।
রিচ ওয়ার্ডেন

@ রিচওয়ার্ডেন এই প্রসঙ্গে "সিঙ্ক্রোনাস" বলতে আপনার অর্থ কী?
জেসন 16

1
নোডে যখন কোনও কিছু "সিঙ্ক্রোনাস" হয় তখন এটি সিস্টেমটিকে অন্য কিছু করতে বাধা দেয়। ধরা যাক আপনার একটি নোড ওয়েবসভার আছে - উপরেরটি ঘটে যাওয়ার সময় অন্য কোনও অনুরোধ যদি আসে তবে সার্ভারটি প্রতিক্রিয়া জানাতে পারে না / কারণ ফাইলটি পড়তে ব্যস্ত।
রিচ ওয়ার্ডেন

27

এই প্রোগ্রামটিতে, 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()। এটি লক্ষণীয় অপেক্ষা করার জন্য একটি বিশাল ফাইল হতে পারে। প্যাকেজ.জসনের মতো একটি জেএসওএন কনফিগারেশন ফাইলটি 1 কেবি এর নীচে হওয়ার সম্ভাবনা রয়েছে, তাই আপনি ঠিক fs.readFile()এবং JSON.parse()এটি পারেন।
জন স্টার দেওর

1
বাফার্ডআডার তার স্বাক্ষর পরিবর্তন করেছে। আমাকে বাফারড্রেডারকে বাফার্ডার রিডার, ডেটারিডার দিয়ে প্রতিস্থাপন করতে হয়েছিল, যেখানে বাফারড্রেডার ছিল মডিউল। Github.com/Gagle/
নোড-

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);
});
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.