রুবির সাথে একটি অ্যারেতে কোনও CSV ফাইলটি পড়া খুব সহজ তবে আমি কোনও CSV ফাইলে অ্যারে কীভাবে লিখব সে সম্পর্কে কোনও ভাল ডকুমেন্টেশন খুঁজে পাই না। কেউ আমাকে কীভাবে বলতে পারেন?
আমি রুবি ব্যবহার করছি 1.9.2 যদি এটি গুরুত্বপূর্ণ।
রুবির সাথে একটি অ্যারেতে কোনও CSV ফাইলটি পড়া খুব সহজ তবে আমি কোনও CSV ফাইলে অ্যারে কীভাবে লিখব সে সম্পর্কে কোনও ভাল ডকুমেন্টেশন খুঁজে পাই না। কেউ আমাকে কীভাবে বলতে পারেন?
আমি রুবি ব্যবহার করছি 1.9.2 যদি এটি গুরুত্বপূর্ণ।
উত্তর:
একটি ফাইলের কাছে:
require 'csv'
CSV.open("myfile.csv", "w") do |csv|
csv << ["row", "of", "CSV", "data"]
csv << ["another", "row"]
# ...
end
একটি স্ট্রিং:
require 'csv'
csv_string = CSV.generate do |csv|
csv << ["row", "of", "CSV", "data"]
csv << ["another", "row"]
# ...
end
এখানে সিএসভি-তে বর্তমান ডকুমেন্টেশন: http://ruby-doc.org/stdlib/libdoc/csv/rdoc/index.html
আমি এটিকে এক লাইনে নামিয়েছি।
rows = [['a1', 'a2', 'a3'],['b1', 'b2', 'b3', 'b4'], ['c1', 'c2', 'c3'], ... ]
csv_str = rows.inject([]) { |csv, row| csv << CSV.generate_line(row) }.join("")
#=> "a1,a2,a3\nb1,b2,b3\nc1,c2,c3\n"
উপরের সমস্ত কিছু করুন এবং একটি লাইনে একটি সিএসভিতে সংরক্ষণ করুন।
File.open("ss.csv", "w") {|f| f.write(rows.inject([]) { |csv, row| csv << CSV.generate_line(row) }.join(""))}
বিঃদ্রঃ:
একটি সক্রিয় রেকর্ড ডাটাবেসকে সিএসভিতে রূপান্তর করা এমন কিছু আমার মনে হয়
CSV.open(fn, 'w') do |csv|
csv << Model.column_names
Model.where(query).each do |m|
csv << m.attributes.values
end
end
হুম @ টমাউস, সেই কথাটি সিএসভি উত্স না পড়ে আমার কাছে কিছুটা বিভ্রান্ত করছে, তবে সাধারণভাবে, ধরে নিচ্ছি আপনার অ্যারেতে প্রতিটি হ্যাশ একই সংখ্যক কে / ভি জোড় রয়েছে এবং কীগুলি সর্বদা একই, একই ক্রমে (যেমন) যদি আপনার ডেটা কাঠামোগত হয়) তবে এটি করা উচিত:
rowid = 0
CSV.open(fn, 'w') do |csv|
hsh_ary.each do |hsh|
rowid += 1
if rowid == 1
csv << hsh.keys# adding header row (column labels)
else
csv << hsh.values
end# of if/else inside hsh
end# of hsh's (rows)
end# of csv open
যদি আপনার ডেটা কাঠামোগত না হয় তবে এটি অবশ্যই কাজ করবে না won't
inject
এখানে অপব্যবহার করছেন , আপনি সত্যিই ব্যবহার করতে চান map
। এছাড়াও, আপনাকে join
ডিফল্ট হিসাবে খালি স্ট্রিংটি পাস করার দরকার নেই । সুতরাং আপনি এটিকে আরও সঙ্কুচিত করতে পারেন:rows.map(&CSV.method(:generate_line).join
CSV.generate(headers: hsh.first&.keys) { |csv| hsh.each { |e| csv << e } }
সমতুল্য সিএসভি উত্পন্ন করে।
যদি কেউ আগ্রহী হন তবে এখানে কিছু ওয়ান-লাইনার রয়েছে (এবং সিএসভিতে টাইপ তথ্য হারাতে একটি নোট):
require 'csv'
rows = [[1,2,3],[4,5]] # [[1, 2, 3], [4, 5]]
# To CSV string
csv = rows.map(&:to_csv).join # "1,2,3\n4,5\n"
# ... and back, as String[][]
rows2 = csv.split("\n").map(&:parse_csv) # [["1", "2", "3"], ["4", "5"]]
# File I/O:
filename = '/tmp/vsc.csv'
# Save to file -- answer to your question
IO.write(filename, rows.map(&:to_csv).join)
# Read from file
# rows3 = IO.read(filename).split("\n").map(&:parse_csv)
rows3 = CSV.read(filename)
rows3 == rows2 # true
rows3 == rows # false
দ্রষ্টব্য: সিএসভি সমস্ত ধরণের তথ্য হারাতে পারে, আপনি বেসিক ধরণের তথ্য সংরক্ষণ করতে JSON ব্যবহার করতে পারেন, বা সমস্ত ধরণের তথ্য সংরক্ষণের জন্য ভার্বোজ (তবে আরও সহজেই মানব-সম্পাদনযোগ্য) ওয়াইএএমএল যেতে পারেন - উদাহরণস্বরূপ, আপনার যদি তারিখের প্রকারের প্রয়োজন হয় যা হয়ে যাবে CSV এবং JSON এ স্ট্রিং।
@ বোল্ডার_রবির উত্তরে বিল্ডিং করা, এটি আমি যা খুঁজছি তা অনুমান করে আমার সংক্ষেপে us_eco
সিএসভি টেবিল রয়েছে।
CSV.open('outfile.txt','wb', col_sep: "\t") do |csvfile|
csvfile << us_eco.first.keys
us_eco.each do |row|
csvfile << row.values
end
end
Https://gist.github.com/tamouse/4647196 এ সংক্ষিপ্তসার আপডেট করেছেন
এ নিয়ে আমি লড়াই করছি। এটি আমার গ্রহণ:
https://gist.github.com/2639448 :
require 'csv'
class CSV
def CSV.unparse array
CSV.generate do |csv|
array.each { |i| csv << i }
end
end
end
CSV.unparse [ %w(your array), %w(goes here) ]
[ %w(your array), %w(goes here) ]
দেখতে সুন্দর লাগবে না। github.com/pry/pry/issues/568