web-dev-qa-db-ja.com

Rakeタスクを介してCSVファイルをインポートするにはどうすればよいですか?

私はこの質問がこのフォーラムで多くの質問を受けたことを知っていますが、私は厳しい締め切りにあり、いくつかの助けが必要なので、アドバイスは大歓迎です。私はRuby on Railsを初めて使用するので、応答するときにそれを覚えておいてください。実行時に複数のテーブルを更新するrakeタスクを作成したいmysqlite dbにあります。これは私のdbに新しいインシデントを作成する移行ファイルです。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
21
RubyDude1012

lib/taskのプロジェクトフォルダーの下に、「import_incidents_csv.rake」と言うrakeファイルを作成します。

これに従って Ruby on Rails-CSVファイルからデータをインポート

レイクファイルには次のコードがあります

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

このタスクは「rake import_incidents_csv:create_incidents」として呼び出すことができます

21
Rubyman

私は何時間も何時間もこれに取り組みました。次のようにして、ようやく機能しました。

  1. モデルのattr_accessibleを反映するヘッダーを最初の行にcsvファイルに追加しました。私の場合、モデルは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データベースブラウザーを使用しました。それが誰かを助けることを願っています!

11
lflores

以下は、rake db:seedを使用してインポートしたCSVの例です。これをseeds.rbファイルに書き込んで、CSVファイルを/public/seed_data/Zip_code.csvに入れました。それはかなり自明です(つまり、csvには3つの列があります:コード、ロング、および緯度です。

コードは各行を解析し、関連するデータを抽出してローカル変数に割り当て、それをレコードに書き込みます。それが役に立てば幸い。

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
2

私はこれを過去に使ったことがあります。あらゆるタイプのモデルをとります。

レーキ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
0
ebilly

RailsのCSVモジュールを使用してcsvファイルを読み取ることができ、レコードを作成できます。詳細なヘルプは次のとおりです csvを使用してdbを入力

0
RAJ