2012-09-17 14 views
21

Tôi biết câu hỏi này đã được hỏi rất nhiều trên diễn đàn này nhưng tôi dưới thời hạn nghiêm ngặt và tôi cần một số trợ giúp, vì vậy mọi lời khuyên đều được đánh giá cao. Tôi mới làm quen với Ruby on Rails vì vậy hãy ghi nhớ điều đó khi bạn trả lời. Tôi muốn tạo ra một nhiệm vụ rake, khi chạy, cập nhật nhiều bảng trong db mysqlite. Đây là tệp di chuyển tạo ra sự cố mới trong db của tôi. Làm cách nào để tạo tác vụ rake sẽ nhập tất cả thông tin này qua tệp CSV. Ai đó có thể XIN cung cấp cho tôi một số trợ giúp trong việc viết các tập tin rake từ đầu đến cuối. Rõ ràng bạn không cần phải viết mọi công việc cho mỗi chuỗi, chỉ cần cho tôi một vài ví dụ. Và bên cạnh tệp cào thực sự, tôi có cần thêm mã vào bất kỳ phần nào khác của ứng dụng không (tôi biết đó là một câu hỏi rất chung chung, nhưng nếu tôi cần thêm mã, tôi sẽ đánh giá cao mô tả chung về vị trí). Tôi cảm thấy một chút hướng dẫn sẽ đi dọc đường. Nếu có ai cần thêm thông tin từ tôi thì hãy hỏi.Làm cách nào để nhập tệp CSV thông qua tác vụ cào?

class CreateIncidents < ActiveRecord::Migration 
    def self.up 
    create_table :incidents do |t| 
     t.datetime :incident_datetime 
     t.string :location 
     t.string :report_nr 
     t.string :responsible_party 
     t.string :area_resident 
     t.string :street 
     t.string :city 
     t.string :state 
     t.string :home_phone 
     t.string :cell_phone 
     t.string :insurance_carrier_name 
     t.string :insurance_carrier_street 
     t.string :insurance_carrier_city 
     t.string :insurance_carrier_state 
     t.string :insurance_carrier_phone 
     t.string :insurance_carrier_contact 
     t.string :policy_nr 
     t.string :vin_nr 
     t.string :license_nr 
     t.string :vehicle_make 
     t.string :vehicle_model 
     t.string :vehicle_year 


     t.timestamps 
    end 
    end 

    def self.down 
    drop_table :incidents 
    end 
end 
+0

này là hữu ích .... > http://stackoverflow.com/questions/3346108/how-to-write-rake-task-to-import- data-to-rails-app –

Trả lời

20

dưới thư mục dự án của bạn trong lib/nhiệm vụ tạo ra một tập tin cào nói "import_incidents_csv.rake"

theo này Ruby on Rails - Import Data from a CSV file

trong tập tin cào đã mã sau

require 'csv' 
namespace :import_incidents_csv do 
    task :create_incidents => :environment do 
    "code from the link" 
    end 
end 

Bạn có thể gọi tác vụ này là "rake import_incidents_csv: create_incidents"

+0

Vấn đề của tôi là tôi không biết mã để đưa vào tệp cào tạo đúng sự cố mới mà không có bất kỳ lỗi nào. Nhưng cảm ơn vì phản ứng. – RubyDude1012

+0

Bạn sẽ cần phải tạo tệp csv với hàng đầu tiên làm tên cột của bảng sự cố. – Rubyman

+0

Đây là mã tôi tìm thấy trên StackOverflow mà tôi đã cố gắng thích ứng với ứng dụng của mình. Tôi đang gặp sự cố khi tải xuống định dạng để đọc mặc dù ... xin lỗi desc "Một dòng mô tả nhiệm vụ" công việc: import_csv do yêu cầu 'csv' csv_text = File.read ('c:/rails/thumb/events.csv ') csv = CSV.parse (csv_text,: tiêu đề => true) csv.each do | row | row = row.to_hash.with_indifferent_access Incidents.create! (Row.to_hash.symbolize_keys) cuối cuối – RubyDude1012

2

Dưới đây là một CSV mẫu mà tôi đã nhập bằng cách sử dụng rake db: seed. Tôi đã viết tệp này vào tệp seed.rb và đặt tệp CSV vào /public/seed_data/zip_code.csv. Nó khá tự giải thích (ví dụ, csv có ba cột: mã, dài và lat.

Mã phân tích mỗi dòng, trích xuất dữ liệu thích hợp và gán nó vào biến cục bộ rồi ghi nó vào một bản ghi. giúp

File.open("#{Rails.root}/public/seed_data/zip_code.csv") do |zip_codes| 
    zip_codes.read.each_line do |zip_code| 
    code, longitude, latitude = zip_code.chomp.split(",") 
    # to remove the quotes from the csv text: 
    code.gsub!(/\A"|"\Z/, '') 
    # to create each record in the database 
    ZipCodeGeo.create!(:zip_code => code, :longitude => longitude, :latitude =>  latitude)    
    end 
end 
11

tôi làm việc về vấn đề này trong nhiều giờ và giờ một ngày cuối cùng tôi đã nhận nó để làm việc bằng cách làm như sau:..

  1. Added một tiêu đề trong hàng đầu tiên đến tập tin csv của tôi rằng phản ánh attr_accessible trong mô hình của tôi. Trong trường hợp của tôi, mô hình của tôi là attr_accessible:intro, :name và trong tệp csv của tôi dòng đầu tiên đọc tên, giới thiệu.
  2. Tạo tệp cào tùy chỉnh. Tôi đặt tên là import.rake của tôi và đặt nó vào thư mục lib/tasks. Đặt mã này trong tập tin đó:
#lib/tasks/import.rake 
require 'csv' 
desc "Imports a CSV file into an ActiveRecord table" 
task :import, [:filename] => :environment do  
    CSV.foreach('myfile.csv', :headers => true) do |row| 
     MyModel.create!(row.to_hash) 
    end 
end 

Sau đó gõ bundle exec rake import vào dòng lệnh.

Để làm việc này, tôi có Trình duyệt cơ sở dữ liệu khá SQLite. Tôi hy vọng rằng sẽ giúp một ai đó!

0

Bạn có thể đọc tệp csv của mình bằng cách sử dụng mô-đun CSV đường ray và có thể tạo bản ghi. Dưới đây là trợ giúp chi tiết: Populate db using csv

0

Tôi đã sử dụng cái này trong quá khứ. Phải mất bất kỳ loại mô hình nào.

rake csv_model_import [bunnies.csv, Bunny]

Hoạt động như một sự quyến rũ.

desc "Imports a CSV file into an ActiveRecord table" 
 
task :csv_model_import, :filename, :model, :needs => :environment do |task,args| 
 
    lines = File.new(args[:filename]).readlines 
 
    header = lines.shift.strip 
 
    keys = header.split(',') 
 
    lines.each do |line| 
 
    params = {} 
 
    values = line.strip.split(',') 
 
    keys.each_with_index do |key,i| 
 
     params[key] = values[i] 
 
    end 
 
    Module.const_get(args[:model]).create(params) 
 
    end 
 
end

+0

mẫu xấu, vì dấu phẩy –