2017-01-16 1 views
0

Ich versuche, eine Rails-Datenbank mit dem Inhalt einer CSV-Datei zu erstellen. Ich bin neu in RoR, also kann ich meinen Fehler nicht finden. Das Skript funktioniert gut, aber es nimmt nicht den Inhalt meiner CSV-Datei (alles ist mit Null gefüllt).CSV Seed funktioniert nicht für Rails-Datenbank

Die Migration:

#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 

Mein Rechen:

#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 

Mein Modell:

#models/transcations.rb 
class Transaction < ApplicationRecord 
end 

Der Anfang der CSV-Datei:

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; 

Vielen Dank für Ihre Hilfe.

+1

Können Sie angeben, was Sie ausgeführt haben und was die Fehlermeldung ist? – leifg

+0

Rake db: migrieren (um die db zu erstellen), rake db: seed (die die db mit dem csv füllen, aber stattdessen einfach für jede Zeile mit nill füllen). Ich bekomme keine Fehlermeldung nach dem Rake db: Seed – AlphaNico

Antwort

3

Mit SmarterCSV

options = {col_sep: ';'} 
SmarterCSV.process('lib/seeds/siren_db.csv', options).each do |chunk| 
    chunk.each do |row| 
    p row 
    end 
end 

Es gibt:

{: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 ein Hash ist, werden Sie die CSV-Header umbenennen müssen ("NOM" -> "NOM_ENT") zu passen Ihre Tabellenspalten oder erhalten Sie den richtigen Schlüssel für jede Spalte.

Wenn die Namen genau passen, können Sie verwenden:

Transaction.create!(row) 

Mit Ruby-CSV

Ich konnte nicht SmarterCSV bekommen Sie die Zeichen mit Akzent zu analysieren. Die Standard-Ruby-CSV funktioniert gut:

require 'csv' 

CSV.foreach('siren.csv', col_sep: ';', headers: true) do |row| 
    p row.to_h 
end 

Es gibt:

{"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} 

Dies sollte aus dem Kasten heraus arbeiten:

Transaction.create!(row.to_h) 
+0

Ich habe gerade versucht, aber das Ergebnis ist das gleiche. Ich bekomme das in der Konsole zum Beispiel: Transaction.find (1) Transaktionslast (0.6ms) SELECT "Transaktionen". * FROM "Transaktionen" WHERE "Transaktionen". "ID" =? GRENZE ? [["ID", 1], ["LIMIT", 1]] => # irb (main) : 002: 0> – AlphaNico

+0

Aber mein CSV-Header passt schon zu meinen Tabellenspalten, nein? – AlphaNico

+0

'nom' ->' nom_ent' –

1

Ist Sie CSV-Datei korrekt analysiert? Ich es trennt Spalten über Semikolon. Wahrscheinlich müssen Sie das in Optionen setzen:

options = {col_sep: ";") 
Verwandte Themen