如何通过rake任务导入CSV文件?

时间:2012-09-17 14:18:44

标签: ruby-on-rails rake import-from-csv

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

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

5 个答案:

答案 0 :(得分:20)

在lib / task的项目文件夹下

创建一个rake文件,说“import_incidents_csv.rake”

跟着这个 Ruby on Rails - Import Data from a CSV file

rake文件中的

有以下代码

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

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

答案 1 :(得分:11)

我有一天工作了几个小时。我终于通过以下方式开始工作:

  1. 在我的csv文件的第一行添加了一个标题,反映了我模型中的attr_accessible。在我的情况下,我的模型是attr_accessible :intro:name,在我的csv文件中,第一行读取名称为intro。
  2. 创建了自定义rake文件。我将我的命名为import.rake并将其放在lib / tasks文件夹中。将此代码放在该文件中:
  3. #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数据库浏览器。我希望能帮助别人!

答案 2 :(得分:2)

以下是我使用rake db:seed导入的CSV示例。我将其写入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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

我过去曾经使用过这个。它需要任何类型的模型。

rake csv_model_import [bunnies.csv,Bunny]

像魅力一样。

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