web-dev-qa-db-fra.com

Comment importer un fichier CSV via une tâche rake?

Je sais que cette question a beaucoup été posée sur ce forum, mais je suis soumis à une date limite stricte et j'ai besoin d'aide, alors tout conseil est grandement apprécié. Je ne connais pas encore Ruby on Rails, alors gardez cela à l’esprit lorsque vous répondez. Je veux créer une tâche de 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 créer une tâche de rake qui saisira toutes ces informations via un fichier CSV. Quelqu'un peut-il s’IL VOUS PLAÎT me donner de l’aide pour l’écriture du fichier rake 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 à part le fichier rake, dois-je ajouter du code à une 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'aimerais une description générale de l'endroit où). Je pense qu'un peu de guidance ira un long chemin. Si quelqu'un a besoin de plus d'informations de moi s'il vous plaît simplement demander.

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

sous votre dossier de projet dans lib/task, créez un fichier rake avec le nom "import_incidents_csv.rake"

suivez ceci Ruby on Rails - Importer des données depuis un fichier CSV

dans le fichier rake ont le 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"

20
Rubyman

J'ai travaillé dessus pendant des heures et des heures un jour. Je l'ai finalement fait fonctionner en procédant comme suit:

  1. Ajout d'un en-tête dans la première ligne de mon fichier csv qui reflétait 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 première lecture, intro. 
  2. Créé un fichier rake personnalisé. J'ai nommé mine 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

Ensuite, tapez bundle exec rake import dans la ligne de commande. 

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

11
lflores

Voici un exemple de fichier CSV que j'ai importé à l'aide de rake db: seed. J'ai écrit ceci dans le fichier seeds.rb et ai placé le fichier CSV dans /public/seed_data/Zip_code.csv. C’est assez explicite (c.-à-d. Que 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. J'espère que ça 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
2
Angelo Chrysoulakis

J'ai déjà utilisé celui-ci dans le passé. Il faut tout type de modèle. 

rake csv_model_import [lapins.csv, lapin]

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
ebilly

Vous pouvez lire votre fichier csv en utilisant le module CSV de Rails et créer des enregistrements. Voici une aide détaillée: Remplir la base de données avec csv

0
RAJ