CSV种子不适用于Rails数据库

时间:2017-01-16 10:44:09

标签: ruby-on-rails ruby csv

我正在尝试使用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;

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

使用SmarterCSV

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)

使用Ruby CSV

我无法让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: ";")