রুবিতে কোনও ফাইলের লাইন কীভাবে পড়বেন


237

আমি কোনও ফাইলের লাইনগুলি পড়তে নিম্নলিখিত কোডটি ব্যবহার করার চেষ্টা করছিলাম। তবে কোনও ফাইল পড়ার সময় বিষয়বস্তুগুলি সমস্ত এক লাইনে থাকে:

line_num=0
File.open('xxx.txt').each do |line|
  print "#{line_num += 1} #{line}"
end

তবে এই ফাইলটি প্রতিটি লাইন আলাদাভাবে প্রিন্ট করে।


আমাকে স্টিডিন ব্যবহার করতে হবে, যেমন ruby my_prog.rb < file.txtআমি যেখানে ধরে নিতে পারি না যে লাইন-এন্ডিং অক্ষরটি ফাইলটি ব্যবহার করে। আমি কীভাবে এটি পরিচালনা করতে পারি?


7
না করে বরং line_num = 0আপনি ব্যবহার করতে পারেন each.each_with_indexবা সম্ভবত each.with_index
অ্যান্ড্রু গ্রিম

@ অ্যান্ড্রু-গ্রিম আপনাকে ধন্যবাদ, এটি ক্লিনার কোড তৈরি করে।
আঁকুন

লাইনের বাই লাইনে আইও ব্যবহারের চেয়ে কেন অগ্রাধিকার দেওয়া হচ্ছে তার জন্য স্ট্যাকওভারফ্লো.com/q/25189262/128421 দেখুন read
টিন ম্যান

line.chompলাইনের শেষগুলি পরিচালনা করতে ব্যবহার করুন ( @ শ্রীনিবাসান্যাক সৌজন্যে )
ইয়ারিন

উত্তর:


150

আমার বিশ্বাস আমার উত্তরটি যে কোনও ধরণের লাইন শেষের উভয় ক্ষেত্রেই পরিচালনা করার বিষয়ে আপনার নতুন উদ্বেগকে কভার করে "\r\n"এবং লাইনগুলি পার্স করার আগে "\r"লিনাক্স স্ট্যান্ডার্ডে রূপান্তরিত হয় "\n"

"\r"নিয়মিত "\n"এবং "\r\n"উইন্ডোজ থেকে ইওএল চরিত্রটিকে সমর্থন করার জন্য আমি এখানে যা করব তা এখানে:

line_num=0
text=File.open('xxx.txt').read
text.gsub!(/\r\n?/, "\n")
text.each_line do |line|
  print "#{line_num += 1} #{line}"
end

অবশ্যই এটি খুব বড় ফাইলগুলিতে একটি খারাপ ধারণা হতে পারে যেহেতু এর অর্থ পুরো ফাইলটিকে মেমোরিতে লোড করা।


এই রেজেক্স আমার পক্ষে কাজ করেনি। ইউনিক্স ফর্ম্যাটটিতে \ n, উইন্ডোজ \ r \ n, ম্যাক ব্যবহার করে \ n - .gsub (/ (\ r |) n) + /, "\ n") সমস্ত ক্ষেত্রে আমার জন্য কাজ করে।
পোড

4
সঠিক রেজেক্স এমন হওয়া উচিত /\r?\n/যা পডের মন্তব্যে যেমন খালি রেখাগুলি একত্রিত না করে \ r \ n এবং both n উভয়ই কভার করবে
ইরঙ্গাজ.কম

12
এটি পুরো ফাইলটিকে মেমোরিতে পড়বে, যা ফাইলের আকারের উপর নির্ভর করে অসম্ভব হতে পারে।
এএমআরজেট

1
এই পদ্ধতি অত্যন্ত অদক্ষ হয়, talabes এখানে উত্তর stackoverflow.com/a/17415655/228589 সেরা উত্তর। এই দুটি পদ্ধতি বাস্তবায়ন যাচাই করুন।
ক্যান্টগেটানিক

1
এটি রুবি উপায় নয়। নীচের উত্তরটি সঠিক আচরণ দেখায়।
মেরোভেক্স

525

এর জন্য রুবির একটি পদ্ধতি রয়েছে:

File.readlines('foo').each do |line|

http://ruby-doc.org/core-1.9.3/IO.html#method-c-readlines


এই প্রদ্ধতি প্রদ্ধতি @Olivier এল যে তুলনায় ধীর
HelloWorld

1
@ হেলো ওয়ার্ল্ড সম্ভবত কারণ এটি প্রতিটি পূর্ববর্তী লাইন মেমরি থেকে মুছে ফেলে এবং প্রতিটি লাইনে মেমরিতে লোড করে। ভুল হতে পারে তবে রুবি সম্ভবত জিনিসগুলি সঠিকভাবে করছেন (যাতে বড় ফাইলগুলি আপনার স্ক্রিপ্টটি ক্র্যাশ না করে)।
সূচনাগুলি

আপনি with_indexএই সঙ্গে ব্যবহার করতে পারেন ?
জোশুয়া পিন্টার

1
হ্যাঁ, আপনি পারেন, উদাহরণস্বরূপFile.readlines(filename).each_with_index { |line, i| puts "#{i}: #{line}" }
ওয়ালফটোন

এই পদ্ধতিটি আরও ভাল বলে মনে হচ্ছে। আমি খুব বড় ফাইলগুলি পড়ছি এবং এইভাবে একবারে পুরো ফাইলটিকে মেমরিতে লোড করার চেষ্টা করে অ্যাপ্লিকেশনটি ক্রাশ হয় না।
শেলবি এস

392
File.foreach(filename).with_index do |line, line_num|
   puts "#{line_num}: #{line}"
end

এটি সম্পূর্ণ ফাইলকে স্মৃতিতে স্লাপ না করে ফাইলের প্রতিটি লাইনের জন্য প্রদত্ত ব্লকটি কার্যকর করে। দেখুন: IO :: foreach


10
এটি উত্তর - প্রতিমা যুক্ত রুবি এবং ফাইলটি স্খলিত হয় না। আরও দেখুন stackoverflow.com/a/5546681/165673
Yarin

4
সবাই রবি দেবতার শিল!
জোশুয়া পিন্টার

কিভাবে লুপ ভিতরে দ্বিতীয় লাইনে যেতে?
ব্যবহারকারী 1735921

18

আপনার প্রথম ফাইলে ম্যাক ক্লাসিক লাইনের শেষ রয়েছে ( "\r"এটি স্বাভাবিকের পরিবর্তে "\n")। এটি দিয়ে খুলুন

File.open('foo').each(sep="\r") do |line|

লাইন শেষ নির্দিষ্ট করতে।


1
দুঃখের বিষয়, পাইথনে সর্বজনীন নিউলাইনগুলির মতো কিছুই নেই, কমপক্ষে আমি জানি।
জোশ লি

আরও একটি প্রশ্ন, আমাকে রুবি my_prog.rb <file.txt এর মতো স্টিডিনও ব্যবহার করতে হবে, যেখানে আমি ধরে নিতে পারি না যে ফাইলটি শেষ হওয়া লাইনটি কী ব্যবহার করে ... আমি কীভাবে এটি পরিচালনা করতে পারি?
আঁকুন

অলিভিয়ের উত্তরটি সহায়ক মনে হয়, যদি আপনি পুরো ফাইলটি মেমরিতে লোড করে ঠিক করেন। ফাইলটি স্ক্যান করার সময় নতুন লাইনের সন্ধান করাতে আরও কিছু কাজ লাগবে।
জোশ লি

7

এটি প্রতিটি লাইনে শেষ লাইনের কারণে। শেষের প্রান্তটি '\ n' বা 'আর' মুছতে মুছতে রুবিতে চম্প পদ্ধতিটি ব্যবহার করুন।

line_num=0
File.open('xxx.txt').each do |line|
  print "#{line_num += 1} #{line.chomp}"
end

2
চম্পের জন্য @ শ্রেনীভিসানএসি +1!
ইয়ারিন

7

আমি শিরোনামযুক্ত ফাইলগুলির জন্য নিম্নলিখিত পদ্ধতির আংশিক:

File.open(file, "r") do |fh|
    header = fh.readline
    # Process the header
    while(line = fh.gets) != nil
        #do stuff
    end
end

এটি আপনাকে সামগ্রীর লাইনের চেয়ে আলাদাভাবে শিরোনাম লাইন (বা লাইন) প্রক্রিয়াকরণ করতে দেয়।


6

কিভাবে সম্পর্কে পায় ?

myFile=File.open("paths_to_file","r")
while(line=myFile.gets)
 //do stuff with line
end

4

ভুলে যাবেন না যে আপনি যদি এমন কোনও ফাইল পড়ার বিষয়ে উদ্বিগ্ন হন যা রানটাইমের সময় আপনার র‌্যামকে জলাবদ্ধ করতে পারে এমন বিশাল রেখা থাকতে পারে তবে আপনি সর্বদা ফাইল টুকরা-খাবার পড়তে পারেন। " একটি ফাইল স্লাপ করা কেন খারাপ " দেখুন।

File.open('file_path', 'rb') do |io|
  while chunk = io.read(16 * 1024) do
    something_with_the chunk
    # like stream it across a network
    # or write it to another file:
    # other_io.write chunk
  end
end
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.