[ruby-on-rails] रेल पर रूबी - एक CSV फ़ाइल से डेटा आयात करें



Answers

Yfeldblum के उत्तर का सरल संस्करण, यह आसान है और बड़ी फ़ाइलों के साथ भी अच्छी तरह से काम करता है:

require 'csv'    

CSV.foreach(filename, :headers => true) do |row|
  Moulding.create!(row.to_hash)
end

With_indifferent_access या symbolize_keys के लिए कोई आवश्यकता नहीं है, और फ़ाइल में पहले स्ट्रिंग में पढ़ने की आवश्यकता नहीं है।

यह पूरी फ़ाइल को स्मृति में एक साथ नहीं रखता है, लेकिन रेखा से लाइन में पढ़ता है और प्रति पंक्ति मोल्डिंग बनाता है।

Question

मैं एक CSV फ़ाइल से डेटा को मौजूदा डेटाबेस तालिका में आयात करना चाहता हूं। मैं सीएसवी फ़ाइल को सहेजना नहीं चाहता हूं, बस उस से डेटा लें और इसे मौजूदा तालिका में डाल दें। मैं रुबी 1.9.2 और रेल 3 का उपयोग कर रहा हूं।

यह मेरी मेज है:

create_table "mouldings", :force => true do |t|
  t.string   "suppliers_code"
  t.datetime "created_at"
  t.datetime "updated_at"
  t.string   "name"
  t.integer  "supplier_id"
  t.decimal  "length",         :precision => 3, :scale => 2
  t.decimal  "cost",           :precision => 4, :scale => 2
  t.integer  "width"
  t.integer  "depth"
end

क्या आप मुझे ऐसा करने के लिए सबसे अच्छा तरीका दिखाने के लिए कुछ कोड दे सकते हैं, धन्यवाद।







एक transaction ब्लॉक के अंदर डेटाबेस से संबंधित प्रक्रिया को लपेटना बेहतर है। कोड स्निपेट झटका भाषा मॉडल के लिए भाषाओं का एक सेट बीजिंग की पूरी प्रक्रिया है,

require 'csv'

namespace :lan do
  desc 'Seed initial languages data with language & code'
  task init_data: :environment do
    puts '>>> Initializing Languages Data Table'
    ActiveRecord::Base.transaction do
      csv_path = File.expand_path('languages.csv', File.dirname(__FILE__))
      csv_str = File.read(csv_path)
      csv = CSV.new(csv_str).to_a
      csv.each do |lan_set|
        lan_code = lan_set[0]
        lan_str = lan_set[1]
        Language.create!(language: lan_str, code: lan_code)
        print '.'
      end
    end
    puts ''
    puts '>>> Languages Database Table Initialization Completed'
  end
end

नीचे स्निपेट languages.csv csv फ़ाइल का आंशिक है,

aa,Afar
ab,Abkhazian
af,Afrikaans
ak,Akan
am,Amharic
ar,Arabic
as,Assamese
ay,Aymara
az,Azerbaijani
ba,Bashkir
...



CSV :: तालिका का उपयोग करना बेहतर है और String.encode(universal_newline: true) का उपयोग करें। यह सीआरएलएफ और सीआर को एलएफ में परिवर्तित कर रहा है




इसे बेहतर तरीके से एक रेक कार्य में शामिल करना है। / Lib / कार्यों / के अंदर import.rake फ़ाइल बनाएं और इस कोड को उस फ़ाइल में रखें।

desc "Imports a CSV file into an ActiveRecord table"
task :csv_model_import, [:filename, :model] => [:environment] do |task,args|
  lines = File.new(args[:filename], "r:ISO-8859-1").readlines
  header = lines.shift.strip
  keys = header.split(',')
  lines.each do |line|
    values = line.strip.split(',')
    attributes = Hash[keys.zip values]
    Module.const_get(args[:model]).create(attributes)
  end
end

उसके बाद आपके टर्मिनल rake csv_model_import[file.csv,Name_of_the_Model] में यह आदेश rake csv_model_import[file.csv,Name_of_the_Model]




Related