2012-09-17 1 views
21

Je sais que cette question a été posée beaucoup sur ce forum mais je suis sous une date limite stricte et j'ai besoin de l'aide, ainsi n'importe quel conseil est très apprécié. Je suis nouveau sur Ruby on Rails alors gardez cela à l'esprit quand vous répondez. Je veux créer une tâche rake qui, lorsqu'elle est exécutée, met à jour plusieurs tables dans mysqlite db. Ceci est un fichier de migration qui crée un nouvel incident dans ma base de données. Comment puis-je créer une tâche rake qui va entrer toutes ces informations via un fichier CSV. Quelqu'un peut-il me donner s'il vous plaît un peu d'aide dans l'écriture du fichier râteau du début à la fin. Évidemment, vous n'avez pas besoin d'écrire chaque tâche pour chaque chaîne, donnez-moi juste quelques exemples. Et en plus du fichier rake réel, dois-je ajouter du code à toute autre partie de mon application (je sais que c'est une question très générale, mais si j'ai besoin d'ajouter du code, j'apprécierais une description générale d'où). Je sens qu'un peu d'orientation va suivre. Si quelqu'un a besoin de plus d'informations de ma part, n'hésitez pas à demander.Comment puis-je importer un fichier CSV via une tâche 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 
+0

cela est utile .... > http://stackoverflow.com/questions/3346108/how-to-write-rake-task-to-import- data-to-rails-app –

Répondre

20

sous votre dossier de projet dans lib/tâche de créer un fichier de rake dire "import_incidents_csv.rake"

Suivre ce Ruby on Rails - Import Data from a CSV file

dans le fichier de coupe ont code suivant

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

Vous pouvez appeler cette tâche comme "rake import_incidents_csv: create_incidents"

+0

Mon problème est que je ne connais pas le code à mettre dans le fichier Rake qui crée correctement le nouvel incident sans aucune erreur. Mais merci pour la réponse. – RubyDude1012

+0

Vous devrez créer un fichier csv avec la première ligne comme noms de colonne de la table des incidents. – Rubyman

+0

C'est le code que j'ai trouvé sur StackOverflow que j'ai essayé d'adapter à mon application. Je vais avoir du mal à obtenir formaté pour lire si ... désolé desc "Une ligne description de la tâche" tâche: import_csv faire require 'csv' csv_text = File.read ('c:/rails/pouce/incidents.csv ') csv = CSV.parse (csv_text,: en-têtes => true) csv.each do | ligne | rang = row.to_hash.with_indifferent_access Incidents.create! (Row.to_hash.symbolize_keys) fin fin – RubyDude1012

2

Voici un exemple de CSV que j'ai importé en utilisant rake db: seed. J'ai écrit ceci dans le fichier seeds.rb et j'ai mis le fichier CSV dans /public/seed_data/zip_code.csv. C'est assez explicite (ie, le csv a trois colonnes: code, long et lat

Le code analyse chaque ligne, extrait les données pertinentes et les affecte à une variable locale puis les écrit dans un enregistrement. aide à

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

J'ai travaillé sur ce pendant des heures et des heures un jour, je enfin mis au travail en procédant comme suit:..

  1. Ajout d'un en-tête dans la première ligne à mon fichier csv qui reflète le attr_accessible dans mon modèle Dans mon cas mon modèle était attr_accessible:intro, :name et dans mon fichier csv, le nom de la première ligne, intro.
  2. Créé un fichier de rake personnalisé. J'ai nommé le mien import.rake et l'ai placé dans le dossier lib/tasks. Placez ce code dans ce fichier:
#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 

Puis tapez bundle exec rake import dans la ligne de commande.

Pour que cela fonctionne, j'avais tout à fait SQLite Database Browser. J'espère que cela aide quelqu'un!

0

Vous pouvez lire votre fichier csv en utilisant CSV module de rails et peut créer des enregistrements. Voici une aide détaillée: Populate db using csv

0

J'ai utilisé celui-ci dans le passé. Cela prend n'importe quel type de modèle.

rake csv_model_import [lapins.csv, Bunny]

Fonctionne comme un charme.

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

Mauvais échantillon, à cause des virgules –

Questions connexes