CSV বলতে “Comma-Separated Values” বোঝায়।
এটি একটি সাধারণ ডেটা ফরম্যাট যা রো এবং কমা-সেপারেটেড ভ্যালুস নিয়ে গঠিত। এটি ডেটা এক্সপোর্ট ও ইমপোর্টে ব্যবহার হয়।
উদাহরণস্বরূপ:
আপনি আপনার জিমেইল কন্ট্যাক্টস CSV ফাইল হিসেবে এক্সপোর্ট করতে পারেন, এবং একই ফরম্যাটে ইমপোর্টও করতে পারেন।
একটি CSV ফাইল এমন দেখায়:
id,name 1,chocolate 2,bacon 3,apple 4,banana 5,almonds
এখন আপনি শিখবেন রুবি CSV লাইব্রেরি ব্যবহার করে CSV ফাইল পড়া ও লিখা।
রুবি CSV পার্সিং
রুবিতে একটি বিল্ট-ইন CSV লাইব্রেরি থাকে।
আপনি সরাসরি একটি ফাইল পড়তে পারেন:
require 'csv' CSV.read("favorite_foods.csv")
বা আপনি CSV ডেটা সম্বিষ্ট একটি স্ট্রিং পার্স করতে পারেন:
require 'csv' CSV.parse("1,chocolate\n2,bacon\n3,apple")
ফলাফল?
আপনি একটি টু-ডাইমেনশনাল অ্যারে পাবেন যেখানে প্রতিটি এন্ট্রি টেবিলের একটি রো।
এটি এমন দেখায়:
[ ["id", "name"], ["1", "chocolate"], ["2", "bacon"], ["3", "apple"], ["4", "banana"], ["5", "almonds"] ]
আপনি এই ডেটার সাথে কাজ করার জন্য অ্যারে ইনডেক্স যেন data[1][1] ব্যবহার করতে পারেন।
কিন্তু এখানে একটি ভালো উপায় আছে!
CSV অপশনস
আপনার ফাইলে হেডার থাকলে আপনি CSV পার্সারকে সেগুলো ব্যবহার করতে বলতে পারেন।
এভাবেই:
table = CSV.parse(File.read("cats.csv"), headers: true)
এখন একটি মাল্টি-ডাইমেনশনাল অ্যারের বদলে আপনি একটি CSV টেবিল অবজেক্ট পাবেন।
এখানে বর্ণনা:
“একটি
CSV::Tableহলো CSV ডকুমেন্ট রিপ্রেজেন্ট করার জন্য একটি টু-ডাইমেনশনাল ডেটা স্ট্রাকচার। টেবিল আপনাকে রো বা কলাম অনুযায়ী ডেটার সাথে কাজ করতে, ম্যানিপুলেট করতে এবং ফলাফলগুলো আবার CSV-এ কনভার্ট করতে দেয়।”
একটি টেবিল দেওয়া থাকলে, আপনি যেকোনো রো থেকে প্রয়োজনীয় ডেটা পেতে পারেন।
উদাহরণ:
table[0]["id"] # "1" table[0]["name"] # "chocolate"
এখানে 0 হলো প্রথম রো, id এবং name হলো কলাম নাম।
দুটি টেবিল মোড আছে:
- by_col
- by_row
টেবিল মোড পরিবর্তন করে (ডিফল্ট row) আপনি ডেটাকে বিভিন্ন কোণ থেকে দেখতে পারেন।
উদাহরণস্বরূপ:
table.by_col[0] # ["1", "2", "3", "4", "5"] table.by_col[1] # ["chocolate", "bacon", "apple", "banana", "almonds"]
এখানে 0 হলো প্রথম কলাম, 1 হলো দ্বিতীয় কলাম।
এই দুটি মেথড টেবিলের একটি কপি রিটার্ন করে।
আপনি যদি অরিজিনাল টেবিলে পরিবর্তন করতে চান তবে by_col! এবং by_row! মেথড ব্যবহার করতে পারেন।
এটি আরও মেমরি-এফিশিয়েন্ট কারণ টেবিলের কোনো কপি তৈরি হয় না।
CSV কনভার্টারস কীভাবে ব্যবহার করবেন
আপনি লক্ষ্য করেছেন হতে পারে আমরা id কলামটি স্ট্রিং অ্যারে হিসেবে পেয়েছি।
আমরা যদি ইন্টিজার চাই তবে?
আপনি প্রতিটি স্ট্রিং-এ to_i কল করে পেতে পারেন…
কিন্তু একটি শর্টকাট আছে!
রুবি CSV লাইব্রেরি কিছুচার কনভার্টার ইমপ্লিমেন্ট করে।
একটি কনভার্টার আপনার জন্য অটোমেটিক্যালি ভ্যালুগুলো ট্রান্সফর্ম করবে।
উদাহরণ:
CSV.parse("1,2,3,4,5") # [["1", "2", "3", "4", "5"]] CSV.parse("1,2,3,4,5", converters: :numeric) # [[1, 2, 3, 4, 5]]
৬টি বিল্ট-ইন কনভার্টার আছে:
- Integer
- Float
- Numeric (Float + Integer)
- Date
- DateTime
- All
কিন্তু আপনি আপনার নিজস্ব কাস্টম কনভার্টারও তৈরি করতে পারেন।
এখানে কীভাবে:
CSV::Converters[:symbol] = ->(value) { value.to_sym rescue value }
আপনি আপনার নতুন কনভার্টার এভাবে ব্যবহার করতে পারেন:
CSV.parse("a,b,c", headers: false, converters: :symbol) # [[:a, :b, :c]]
নতুন CSV ফাইল কীভাবে তৈরি করবেন
CSV ফাইল বিভিন্নভাবে পড়া ও পার্স করার পাশাপাশি আপনি স্ক্র্যাচ থেকে একটি CSV তৈরি করতে পারেন।
এটি সহজ উপায়:
cats = [ [:blue, 1], [:white, 2], [:black_and_white, 3] ] cats.map { |c| c.join(",") }.join("\n")
আপনি generate মেথডও ব্যবহার করতে পারেন:
CSV.generate do |csv| csv << [:blue, 1] csv << [:white, 2] csv << [:black_and_white, 3] end
এটি ডেটাকে সঠিক ফরম্যাটে প্রস্তুত করে।
আপনি যদি ফাইলে লিখতে চান তবে File.write("cats.csv", data) এর মত কিছু ব্যবহার করতে হবে, অথবা generate-এর বদলে ফাইল নাম এবং রাইট মোডসহ open ব্যবহার করতে পারেন।
এভাবেই:
CSV.open("cats.csv", "w") do |csv| csv << [:white, 2] end
এখন আপনার একটি নতুন CSV ফাইল есть!
CSV জেমস এবং পারফরম্যান্স
বিল্ট-ইন লাইব্রেরি ভালো এবং কাজটি করিয়ে দেবে।
কিন্তু আপনি কিছু CSV পার্সিং জেমও পাবেন যেগুলোর ভিন্ন ফিচার আছে।
উদাহরণস্বরূপ, smarter_csv জেম আপনার CSV ডেটাকে হ্যাশের অ্যারে-এ কনভার্ট করবে।
উদাহরণ:
require 'smarter_csv' IntegerConverter = Object.new def IntegerConverter.convert(value) Integer(value) end SmarterCSV.process('testing.csv', value_converters: { id: IntegerConverter }) # [{:id=>1, :name=>"a"}, {:id=>2, :name=>"b"}, {:id=>3, :name=>"c"}]
এখানে একটি পারফরম্যান্স তুলনা:
Comparison: CSV: 112.9 i/s Smarter CSV: 21.7 i/s - 5.21x slower Tabular: 17.3 i/s - 6.52x slower
সারসংক্ষেপ
আপনি রুবিতে CSV ফাইল পড়া ও লিখা শিখেছেন! আপনি কনভার্টার এবং CSV ডেটা প্রসেস করার জন্য বিকল্প রুবি জেমসও শিখেছেন।
আপনি যদি বড় CSV ফাইল প্রসেস করতে চান (> 10MB) তবে আপনি CSV.foreach(file_name) মেথড একটি ব্লকসহ ব্যবহার করতে পারেন। এটি একবারে একটি রো পড়বে এবং অনেক কম মেমরি ব্যবহার করবে।
দয়া করে এই আর্টিকেলটি শেয়ার করুন যাতে আরও মানুষ এটি খুঁজে পায়!