我正在尝试使用CSV文件的内容播种Rails数据库。我是RoR的新手,所以我找不到自己的错误。该脚本运行良好,但它不会获取我的CSV文件的内容(所有内容都由nil填充)。
迁移:
#db/migrate/x_create_transactions.rb
class CreateTransactions < ActiveRecord::Migration[5.0]
def change
create_table :transactions
add_column :transactions, :siren, :integer
add_column :transactions, :nom_ent, :string
add_column :transactions, :adresse, :string
add_column :transactions, :complement_adresse, :string
add_column :transactions, :cp_ville, :string
add_column :transactions, :pays, :string
add_column :transactions, :region, :string
add_column :transactions, :departement, :integer
add_column :transactions, :activite, :string
add_column :transactions, :date, :integer
add_column :transactions, :nb_salaries, :string
add_column :transactions, :nom, :string
add_column :transactions, :prenom, :string
add_column :transactions, :civilite, :string
add_column :transactions, :adr_mail, :string
add_column :transactions, :libele_acti, :string
add_column :transactions, :categorie, :string
add_column :transactions, :tel, :integer
end
end
我的耙子:
#db/migrate/seeds.rb
require 'smarter_csv'
options = {}
SmarterCSV.process('lib/seeds/siren_db.csv', options) do |chunk|
chunk.each do |row|
Transaction.create!( {
:siren => row[0],
:nom_ent => row[1],
:adresse => row[2],
:complement_adresse => row[3],
:cp_ville => row[4],
:pays => row[5],
:region => row[6],
:departement => row[7],
:activite => row[8],
:date => row[9],
:nb_salaries => row[10],
:nom => row[11],
:prenom => row[12],
:civilite => row[13],
:adr_mail => row[14],
:libele_acti => row[15],
:categorie => row[16],
:tel => row[17]
})
end
end
我的模特:
#models/transcations.rb
class Transaction < ApplicationRecord
end
csv文件的开头:
siren;nom_ent;adresse;complement_adresse;cp_ville;pays;region;departement;activite;date;nb_salaries;nom;prenom;civilite;adr_mail;libele_acti;categorie;tel
38713707;SYND COPR DU 6 AU 8 RUE DE CHARONNE 75;6 RUE DE CHARONNE;;75011 PARIS;FRANCE;Île-de-France;75;Activités combinées de soutien lié aux bâtiments;2008;1 ou 2 salariés;;;;;Syndicat de copropriété ;PME;
38713707;SYND COPR DU 6 AU 8 RUE DE CHARONNE 75;6 RUE DE CHARONNE;;75011 PARIS;FRANCE;Île-de-France;75;Activités combinées de soutien lié aux bâtiments;2008;1 ou 2 salariés;;;;;Syndicat de copropriété ;PME;
38724340;SYND COPR DU 18 BD ARAGO 75013 PARIS;18 BOULEVARD ARAGO;;75013 PARIS;FRANCE;Île-de-France;75;Activités combinées de soutien lié aux bâtiments;2008;1 ou 2 salariés;;;;;Syndicat de copropriété ;PME;
感谢您的帮助。
答案 0 :(得分:3)
options = {col_sep: ';'}
SmarterCSV.process('lib/seeds/siren_db.csv', options).each do |chunk|
chunk.each do |row|
p row
end
end
输出:
{:siren=>38713707, :adresse=>"6 RUE DE CHARONNE", :cp_ville=>"75011 PARIS", :pays=>"FRANCE", :region=>"le-de-France", :departement=>75, :activite=>"Activits combines de soutien li aux btiments", :date=>2008, :nb_salaries=>"1 ou 2 salaris", :libele_acti=>"Syndicat de coproprit", :categorie=>"PME"}
{:siren=>38713707, :adresse=>"6 RUE DE CHARONNE", :cp_ville=>"75011 PARIS", :pays=>"FRANCE", :region=>"le-de-France", :departement=>75, :activite=>"Activits combines de soutien li aux btiments", :date=>2008, :nb_salaries=>"1 ou 2 salaris", :libele_acti=>"Syndicat de coproprit", :categorie=>"PME"}
{:siren=>38724340, :adresse=>"18 BOULEVARD ARAGO", :cp_ville=>"75013 PARIS", :pays=>"FRANCE", :region=>"le-de-France", :departement=>75, :activite=>"Activits combines de soutien li aux btiments", :date=>2008, :nb_salaries=>"1 ou 2 salaris", :libele_acti=>"Syndicat de coproprit", :categorie=>"PME"}
row
是一个哈希,你必须重命名CSV标题(“NOM” - &gt;“NOM_ENT”)以适合您的表格列,或者获取每列的正确密钥。
如果名称完全符合,您将能够使用:
Transaction.create!(row)
我无法让SmarterCSV解析重音字符。标准的Ruby CSV可以正常工作:
require 'csv'
CSV.foreach('siren.csv', col_sep: ';', headers: true) do |row|
p row.to_h
end
输出:
{"siren"=>"38713707", "nom_ent"=>"SYND COPR DU 6 AU 8 RUE DE CHARONNE 75", "adresse"=>"6 RUE DE CHARONNE", "complement_adresse"=>nil, "cp_ville"=>"75011 PARIS", "pays"=>"FRANCE", "region"=>"Île-de-France", "departement"=>"75", "activite"=>"Activités combinées de soutien lié aux bâtiments", "date"=>"2008", "nb_salaries"=>"1 ou 2 salariés", "nom"=>nil, "prenom"=>nil, "civilite"=>nil, "adr_mail"=>nil, "libele_acti"=>"Syndicat de copropriété ", "categorie"=>"PME", "tel"=>nil}
{"siren"=>"38713707", "nom_ent"=>"SYND COPR DU 6 AU 8 RUE DE CHARONNE 75", "adresse"=>"6 RUE DE CHARONNE", "complement_adresse"=>nil, "cp_ville"=>"75011 PARIS", "pays"=>"FRANCE", "region"=>"Île-de-France", "departement"=>"75", "activite"=>"Activités combinées de soutien lié aux bâtiments", "date"=>"2008", "nb_salaries"=>"1 ou 2 salariés", "nom"=>nil, "prenom"=>nil, "civilite"=>nil, "adr_mail"=>nil, "libele_acti"=>"Syndicat de copropriété ", "categorie"=>"PME", "tel"=>nil}
{"siren"=>"38724340", "nom_ent"=>"SYND COPR DU 18 BD ARAGO 75013 PARIS", "adresse"=>"18 BOULEVARD ARAGO", "complement_adresse"=>nil, "cp_ville"=>"75013 PARIS", "pays"=>"FRANCE", "region"=>"Île-de-France", "departement"=>"75", "activite"=>"Activités combinées de soutien lié aux bâtiments", "date"=>"2008", "nb_salaries"=>"1 ou 2 salariés", "nom"=>nil, "prenom"=>nil, "civilite"=>nil, "adr_mail"=>nil, "libele_acti"=>"Syndicat de copropriété ", "categorie"=>"PME", "tel"=>nil}
这应该是开箱即用的:
Transaction.create!(row.to_h)
答案 1 :(得分:1)
您是否正确解析了CSV文件?我通过分号分隔列。你可能不得不把它放到选项中:
options = {col_sep: ";")