পিএইচপি-তে স্বল্প পরিমাণে ডেটা নিয়ে কাজ করার সময়, ডেটাবেস তৈরি করা এবং স্ক্রিপ্টগুলির সাথে মিথস্ক্রিয়াটি সংঘবদ্ধ করার চেয়ে কখনও কখনও এগুলি ফাইলে সংরক্ষণ করা সহজ easier এই জাতীয় ক্ষেত্রে, একটি পাঠ্য ফাইল থেকে নির্দিষ্ট লাইনগুলি মুছে ফেলার কাজটি অস্বাভাবিক নয়। আসুন এটি করার সহজতম উপায়টি ঘনিষ্ঠভাবে দেখে নেওয়া যাক।
প্রয়োজনীয়
পিএইচপি এর প্রাথমিক জ্ঞান
নির্দেশনা
ধাপ 1
প্রাথমিক তথ্য:
- আমাদের কাছে একটি পাঠ্য ফাইল allStrings.txt রয়েছে, এতে বেশ কয়েকটি ডেটা লাইন রয়েছে
- ফাইলটি থেকে 44 নং লাইনটি মুছতে হবে
সমস্যাটি সমাধানের জন্য অ্যালগরিদম নীচে হবে: আপনার ফাইলটি খোলার দরকার আছে, এতে থাকা লাইনগুলি স্ট্রিংগুলির একটি অ্যারেতে পড়তে হবে এবং বিদ্যমান ফাইলটিকে অ্যারের সামগ্রীগুলি দিয়ে ওভাররাইট করতে হবে, মোছার উদ্দেশ্যে করা লাইনটি এড়ানো হবে।
ধাপ ২
স্ক্রিপ্টে এই অ্যালগরিদমটি বাস্তবায়নের জন্য, আমরা প্রথমে ভেরিয়েবলগুলিকে মান নির্ধারণ করি যা উত্স ফাইলের নাম এবং মুছে ফেলার জন্য রেখার সংখ্যা থাকবে: $ fileName = "allStrings.txt";
$ lineToKill = 44; তারপরে ফাইলটি স্ট্রিংগুলির একটি অ্যারে হিসাবে পড়ুন: $ স্ট্রিংস অ্যারে = ফাইল ($ fileName); আসুন পরীক্ষা করে দেখি যে ফাইলটি আমাদের প্রয়োজনীয় রেখায় রয়েছে কিনা তা পরীক্ষা করে দেখুন। শর্ত $ লাইন টোকিল $ স্ট্রিংস অ্যারে অ্যারে রেখার সংখ্যার চেয়ে বেশি না হলে কেবলমাত্র সমস্ত পরবর্তী কোড কার্যকর করা হবে: যদি ($ lineToKill <= গণনা ($ স্ট্রিংস অ্যারে)) {
// এটি প্রোগ্রামের প্রধান লুপ হবে
Condition শর্তটি পূরণ না হলে আমাদের মোছার কিছুই নেই। স্ক্রিপ্টটি এ সম্পর্কে একটি তথ্যমূলক বার্তা প্রিন্ট করতে দিন: অন্যথায় প্রতিধ্বনিত করুন "ফাইলের লাইনের সংখ্যা" এর চেয়ে কম is fileHandle = fopen ($ fileName, "w"); এখন আমাদের একটি লুপটি সাজানো উচিত যা স্ট্রিং অ্যারের সমস্ত উপাদানগুলিতে পুনরাবৃত্তি করে। তবে যেহেতু অ্যারে সূচনাটি শূন্য থেকে শুরু হয়, এবং আমরা এক থেকে মুছে ফেলার জন্য লাইন সংখ্যাটি গণনা করি, তারপরেও লুপটি শুরুর আগেই আমরা প্রতিটি পর্বে এই ক্রিয়াটি পুনরাবৃত্তি না করে: $ lineToKill -; একটি লুপ সংগঠিত করতে: foreach ($ কী => $ মান হিসাবে স্ট্রিংস অ্যারে) {
// লুপের প্রতিটি ধাপের কোড এখানে
$ কী ভেরিয়েবলটিতে অ্যারেতে বর্তমান লাইনের সূচি থাকবে এবং $ মান ভেরিয়েবল এই রেখার মান ধারণ করবে। লুপের প্রতিটি ধাপে, আমরা মুছে ফেলা হবে এমন সংখ্যার সাথে অ্যারে রেখার সূচকটি তুলনা করব এবং যদি এটি মেলে না, তবে আমরা এই লাইনের মানটি ফাইলে লিখব: যদি ($ কী! = $ LineToKill) fwrit ($ fileHandle, $ value); they যদি এটি মেলে, তবে আমরা ফাইলটিতে লিখব না, তবে সফল মুছে ফেলার বিষয়ে একটি বার্তা প্রিন্ট করব: অন্যথায় "লাইন"।: লাইনটোকিল। "মুছে ফেলা হয়েছে।"; এবং চক্রের শেষে, যখন ফাইলটিতে লেখার কাজ শেষ হয়, আপনার বিনয়ের সাথে এটি বন্ধ করা উচিত: fclose ($ fileHandle);
ধাপ 3
সম্পূর্ণ কোডটি দেখতে এইরকম হবে: <? Php $ fileName = "allStrings.txt";
$ lineToKill = 44; ings স্ট্রিংস অ্যারে = ফাইল ($ fileName);
যদি ($ lineToKill <= গণনা ($ স্ট্রিংস অ্যারে)) {
; fileHandle = fopen ($ fileName, "w");
$ লাইনটোকিল--;
foreach ($ কী => $ মান হিসাবে স্ট্রিংআরাই))
যদি ($ key! = $ lineToKill) fwrit ($ fileHandle, $ value);
অন্যথায় "লাইন" প্রতিধ্বনিত করুন $ লাইনটোকিল। "মোছা"; ";
}
fclose ($ fileHandle);
}?> অবশ্যই এটি সর্বাধিক সহজ কোড, যাতে স্ক্রিপ্টের কাজকালের সময়ে বাস্তব পরিস্থিতিতে দেখা দিতে পারে এমন সমস্ত জটিলতার বিরুদ্ধে কোনও সুরক্ষা নেই। উদাহরণস্বরূপ, যদি কোনও ফাইলে বিশাল সংখ্যক লাইন থাকে তবে সেগুলি অ্যারেতে পড়লে এমন একটি অংশ কাটবে যা সার্ভার রিসোর্স থেকে এক স্ক্রিপ্টের জন্য অনিবার্যভাবে বড়। অবশ্যই, প্রচুর পরিমাণে ডেটা সহ কাজটি পাঠ্য ফাইল নয়, ডাটাবেসের মাধ্যমে সংগঠিত করা উচিত। তবে তবুও, একটি শিক্ষামূলক উদাহরণ হিসাবে, আমরা একটি কোড দেব যা এই সমস্যাটিকেও সমাধান করে। এখানে অ্যালগরিদম আগেরটির চেয়ে আলাদা হবে: অ্যারেটিতে বিশাল সংখ্যক লাইন সঞ্চয় না করার জন্য, স্ক্রিপ্টটি উত্স ফাইল থেকে একবারে একটি লাইন পড়ে এবং অস্থায়ী ফাইলটিতে একে একে লিখবে। এই প্রক্রিয়া শেষে, মূল ফাইলটি মুছে ফেলা হবে, এবং অস্থায়ী ফাইলটি তার জায়গায় সরানো হবে।
পদক্ষেপ 4
এই স্ক্রিপ্টটি আগেরটির মতোই শুরু হবে:
; fileName = "allStrings.txt";
$ lineToKill = 44;
তারপরে আপনাকে কাজের জন্য একটি অস্থায়ী ফাইল তৈরি করতে হবে। আসুন এটি "tmp" ফোল্ডারে করুন এবং অস্থায়ী ফাইলটিতে একই উপসর্গটি দিন: $ টেম্পাইল = টেম্পনাম ("/ টিএমপি", "টিএমপি"); এখন পড়ার জন্য উত্স ফাইলটি খোলার চেষ্টা করি: যদি ($ fileHandle = @ ফপেন ($ ফাইলের নাম, "আরবি")) {
// উত্স ফাইলটি খোলার ক্ষেত্রে এই কোডটি কার্যকর করা হবে
This যদি এটি ব্যর্থ হয় - স্ক্রিপ্টটির আরও কাজটি বোঝায় না, আমরা সংশ্লিষ্ট বার্তা জারি করে প্রক্রিয়াটি মেরে ফেলব: অন্যথায় মরে ("উত্স ফাইলটি উপস্থিত নেই!"); যদি ফাইলটি সাধারণত খোলা থাকে, তবে আমরা এটি সম্পর্কে একটি বিজ্ঞপ্তি প্রিন্ট করবে এবং পূর্ববর্তী নির্মিত অস্থায়ী ফাইলটিকে সংশ্লিষ্ট বার্তার সাথে খোলার চেষ্টা করবে: প্রতিধ্বনি "উত্স ফাইল উপস্থিত রয়েছে";
যদি ($ tempHandle = fopen ($ tempFile, "w")) প্রতিধ্বনিত হয় "একটি অস্থায়ী ফাইল তৈরি করা হয়েছে।"; এখন সময় উত্স ফাইলটি থেকে পঠন পংক্তির একটি লুপ শুরু করার সময় চলে যা এটি শেষ না হওয়া অবধি অব্যাহত থাকবে ফাইলটি: যখন (! ফিউফ ($ ফাইলহ্যান্ডল)) {
// এখানে বর্তমান লাইনের সাথে কাজ করার কোড থাকবে
Op লুপের প্রতিটি ধাপে, আমরা একটি লাইন পড়ব: $ lineToWrite = fgets (H fileHandle); এবং যদি এটি মুছে ফেলা লাইনটি না হয়, তবে এটি একটি অস্থায়ী ফাইলে লিখুন। লাইন কাউন্টার $ lineNum সরাসরি তুলনা ক্রিয়ায় বৃদ্ধি করা হবে: যদি ($ lineToKill! = (++ $ lineNum)) fwrite ($ টেম্প্যান্ডেল, $ lineToWrite); লাইনগুলি শেষ হয়ে গেলে, ফাইলটি বন্ধ করুন: fclose ($ fileHandle);
fclose ($ tempHandle); অবশেষে, টেম্প ফাইলটি মূলের সাথে নামকরণ করুন। যদি এই অপারেশনটি সফল হয়, তবে আমরা একটি সম্পর্কিত বার্তা প্রকাশ করব: যদি (পুনর্নবীকরণ ((টেম্পাইল, $ fileName)) প্রতিধ্বনি "লাইনের $ লাইনটোকিল মুছে ফেলা হয়েছে";
পদক্ষেপ 5
সম্পূর্ণ কোড:
<? php $ fileName = "allStrings.txt";
$ লাইনটোকিল = 44; $ টেম্পাইল = টেম্পনাম ("/ টিএমপি", "টিএমপি");
যদি ($ fileHandle = @fopen ($ fileName, "rb")) {
প্রতিধ্বনি "উত্স ফাইল বিদ্যমান";
যদি ($ tempHandle = fopen ($ টেম্পাইল, "ডাব্লু")) প্রতিধ্বনি "অস্থায়ী ফাইল তৈরি করা হয়েছে।";
}
অন্যথায় মরে ("উত্স ফাইল উপস্থিত নেই!"); ((ফ্যুফ ($ ফাইলহ্যান্ডল))) {
; lineToWrite = fgets (H fileHandle);
যদি ($ lineToKill! = (++ $ lineNum)) fwrite ($ টেম্প্যান্ডেল, $ লাইনটোয়রাইট);
c fclose ($ fileHandle);
fclose ($ টেম্প হ্যান্ডল);
যদি (পুনর্নবীকরণ ($ tempFile, $ fileName)) প্রতিধ্বনিত হয় "লাইন $ লাইনটোকিল সরানো হয়েছে";?>