ruby-on-rails - importing csv rails
¿Cómo puedo importar un archivo CSV a través de una tarea de rake? (5)
Aquí hay un ejemplo de CSV que importé usando rake db: seed. Escribí esto en el archivo seeds.rb y puse el archivo CSV en /public/seed_data/zip_code.csv. Es bastante autoexplicativo (es decir, el csv tiene tres columnas: código, largo y lat.
El código analiza cada línea, extrae los datos pertinentes y los asigna a una variable local y luego los escribe en un registro. Espero eso ayude.
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
Sé que esta pregunta se ha planteado mucho en este foro, pero tengo una fecha límite estricta y necesito ayuda, por lo que cualquier consejo es muy apreciado. Soy nuevo en Ruby on Rails, así que tenlo en cuenta al responder. Quiero crear una tarea de rake que, cuando se ejecuta, actualiza varias tablas en mysqlite db. Este es un archivo de migración que crea un nuevo incidente en mi db. ¿Cómo creo una tarea de rake que ingrese toda esta información a través de un archivo CSV? ¿Puede alguien, POR FAVOR, ayudarme a escribir el archivo de rastrillo de principio a fin? Obviamente no necesitas escribir cada tarea para cada cadena, solo dame algunos ejemplos. Y además del archivo de rastrillo real, ¿necesito agregar código a otra parte de mi aplicación (sé que es una pregunta muy general, pero si necesito agregar código, apreciaría una descripción general de dónde). Siento que un poco de orientación irá por el camino. Si alguien necesita más información de mi por favor solo pregunte.
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
He usado este en el pasado. Lleva cualquier tipo de modelo.
rastrillo csv_model_import [bunnies.csv, Bunny]
Funciona de maravilla.
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
Puede leer su archivo csv utilizando el módulo CSV
de rieles y puede crear registros. Aquí está la ayuda detallada: poblar db usando csv
Trabajé en esto por horas y horas un día. Finalmente lo hice funcionar haciendo lo siguiente:
- Agregué un encabezado en la primera fila a mi archivo csv que reflejaba el
attr_accessible
en mi modelo. En mi caso, mi modelo fueattr_accessible
:intro
attr_accessible
:name
y en mi archivo csv la primera línea leyó name, intro. - Creó un archivo rastrillo personalizado. Nombré el archivo import.rake y lo coloqué en la carpeta lib / tasks. Coloque este código en ese archivo:
#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
Luego escriba bundle exec rake import
en la línea de comando.
Para hacer que esto funcionara tuve bastante SQLite Database Browser. ¡Espero que ayude a alguien!
debajo de la carpeta del proyecto en lib / task cree un archivo de rake que diga "import_incidents_csv.rake"
siga esto Ruby on Rails - Importar datos desde un archivo CSV
En el archivo rastrillo tenemos el siguiente código
require ''csv''
namespace :import_incidents_csv do
task :create_incidents => :environment do
"code from the link"
end
end
Puede llamar a esta tarea como "rake import_incidents_csv: create_incidents"