Подтвердить что ты не робот

Как импортировать CSV файл с помощью команды rake?

Я знаю, что этот вопрос был задан очень много на этом форуме, но я нахожусь в строгом сроке, и мне нужна помощь, поэтому любые советы очень ценятся. Я новичок в Ruby on Rails, поэтому имейте это в виду, когда отвечаешь. Я хочу создать задачу rake, которая при запуске обновляет несколько таблиц в mysqlite db. Это файл миграции, который создает новый инцидент в моем db. Как создать задачу rake, которая будет вводить всю эту информацию через файл CSV. Может кто-нибудь ПОЖАЛУЙСТА, дайте мне некоторую помощь в написании файла рейка от начала до конца. Очевидно, вам не нужно писать каждую задачу для каждой строки, просто дайте мне несколько примеров. И, кроме фактического файла 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
4b9b3361

Ответ 1

в папке вашего проекта в lib/task создайте файл рейка, скажем: "import_incidents_csv.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"

Ответ 2

Я работал над этим несколько часов и часов. Я, наконец, получил его для работы, выполнив следующие действия:

  • Добавлен заголовок в первой строке в файл csv, который отображает attr_accessible в моей модели. В моем случае моя модель была attr_accessible :intro, :name, а в моем файле csv - первая строка с именем, intro.
  • Создал пользовательский файл рейка. Я назвал мой 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 Database Browser. Надеюсь, это поможет кому-то!

Ответ 3

Вот пример CSV, который я импортировал, используя rake db: seed. Я написал это в файле seeds.rb и поместил файл CSV в /public/seed _data/zip_code.csv. Это довольно объяснительно (т.е. Csv имеет три столбца: code, long и lat.

Код анализирует каждую строку, извлекает соответствующие данные и присваивает ее локальной переменной, а затем записывает ее в запись. Надеюсь, что это поможет.

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

Ответ 4

Вы можете прочитать свой файл csv с помощью модуля CSV рельсов и создать записи. Вот подробная справка: Залить db с помощью csv

Ответ 5

Я использовал этот в прошлом. Требуется модель любого типа.

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