2012-09-17 47 views
21

我知道这个问题已经在这个论坛上问了很多,但我在严格的最后期限,我需要一些帮助,所以任何意见是非常感激。我是Ruby on Rails的新手,所以在回复时请记住这一点。我想创建一个rake任务,在运行时更新mysqlite db中的多个表。这是一个迁移文件,在我的db中创建一个新的事件。如何创建一个rake任务,通过CSV文件输入所有这些信息。有人可以给我一些帮助,从头到尾编写耙文件。显然,你不需要为每个字符串编写每个任务,只给我几个例子。除了实际的rake文件,我是否需要将代码添加到我的应用程序的任何其他部分(我知道这是一个非常普遍的问题,但如果确实需要添加代码,我将不胜感激一般的描述)。我觉得有一点指导会顺利进行。如果有人需要我提供更多信息,请提问。如何通过rake任务导入CSV文件?

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

这是有益.... > http://stackoverflow.com/questions/3346108/how-to-write-rake-task-to-import- data-to-rails-app –

回答

20
中的lib /任务的项目文件夹下创建

耙文件说 “import_incidents_csv.rake”

关注该 Ruby on Rails - Import Data from a CSV file

在耙文件

有下面的代码

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

您可以将此任务称为“rake import_incidents_csv:create_incidents”

+0

我的问题是,我不知道放入rake文件的代码是否正确地创建了新的事件,没有任何错误。但谢谢你的回应。 – RubyDude1012

+0

您需要创建一个带有第一行的csv文件作为事件表的列名。 – Rubyman

+0

这是我在StackOverflow上找到的代码,我尝试去适应我的应用程序。我无法得到它格式化虽然读...对不起desc“的一号线任务描述” 任务:import_csv做 需要“CSV” csv_text = File.read('C:/导轨/拇指/ incidents.csv') csv = CSV.parse(csv_text,:headers => true) csv.each do | row | 行= row.to_hash.with_indifferent_access Incidents.create!(row.to_hash.symbolize_keys) 结束 结束 – RubyDude1012

2

这是我使用rake db导入的一个CSV示例:seed。我将它写入了seeds.rb文件,并将CSV文件放入/public/seed_data/zip_code.csv。这是相当自我解释(即,CSV有三列:代码,长和经纬度

该代码解析每一行,提取有关的数据,并将其分配给一个局部变量,然后写入一个记录。帮助

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

我从事这几个小时有一天,我终于得到它通过执行以下工作:。在第一行

  1. 增加了一个头,以反映我的csv文件在我的模型中的attr_accessible。在我的情况下,我的模型是attr_accessible:intro,:name并在我的csv文件中的第一行读取名称,介绍。
  2. 创建了一个自定义rake文件。我将它命名为import.rake并将其放在lib/tasks文件夹中。将此代码放置在该文件中:
#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 

然后输入到bundle exec rake import命令行。

为了让这个工作,我有相当SQLite数据库浏览器。我希望能帮助别人!

0

您可以使用rails的CSV模块来读取您的csv文件,并可以创建记录。这里有详细的帮助:Populate db using csv

0

我以前用过这个。它需要任何类型的模型。

rake csv_model_import [bunnies。csv,兔子]

工程就像一个魅力。

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

不好的样本,因为逗号 –