2012-01-19 13 views
4

初心者質問....Ruby on RailsをMySQLにインポートする

プロジェクトをレールで開始しようとしています。私はcsv形式の異なるスプレッドシートを持っていますが、私はデータを操作できるようにMySQLデータベースにインポートしたいと思います。

stackoverflow、Googleなどを見回した後、私は、作業を行うためにfastercsvを必要とするレーキタスクを書きました。私は間違いをしていますので、あなたが助けてくれるとうれしいです

... 私は 'csv'と 'fastercsv'を使用するようにコードを変更しました...まだエラーが発生しています。レーキファイルの

新しいコードの下を参照してください(3を取る):

require 'csv' 

desc "Import gac from csv file" 
task :import => [:environment] do 

    file = "gac.csv" 

    CSV.foreach(file, :headers => true) do |row| 
    Institution.create({ 
    :institution_name => row[0], 
    :website => row[1],  
    :email => row[2], 
    :category_1 => row[3], 
    :category_2 => row[4], 
    :category_3 => row[5], 
    :category_4 => row[6], 
    :category_5 => row[7], 
    :category_6 => row[8], 
    :category_7 => row[9], 
    :category_8 => row[10], 
    :category_9 => row[11], 
    :category_10 => row[12], 
    :category_11 => row[13], 
    :institution_description => row[14] 
    }) 
    end 
end 

エラーコード:

Daves-MacBook-Pro:vendor dave$ rake import --trace 
** Invoke import (first_time) 
** Invoke environment (first_time) 
** Execute environment 
** Execute import 
rake aborted! 
invalid byte sequence in UTF-8 
/Users/dave/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/csv.rb:1855:in `sub!' 
/Users/dave/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/csv.rb:1855:in `block in shift' 
/Users/dave/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/csv.rb:1849:in `loop' 
/Users/dave/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/csv.rb:1849:in `shift' 
/Users/dave/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/csv.rb:1791:in `each' 
/Users/dave/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/csv.rb:1208:in `block in foreach' 
/Users/dave/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/csv.rb:1354:in `open' 
/Users/dave/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/csv.rb:1207:in `foreach' 
/Users/dave/rails_projects/vendor/lib/tasks/import.rake:8:in `block in <top (required)>' 
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/task.rb:205:in `call' 
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/task.rb:205:in `block in execute' 
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/task.rb:200:in `each' 
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/task.rb:200:in `execute' 
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/task.rb:158:in `block in invoke_with_call_chain' 
/Users/dave/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize' 
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/task.rb:151:in `invoke_with_call_chain' 
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/task.rb:144:in `invoke' 
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/application.rb:116:in `invoke_task' 
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/application.rb:94:in `block (2 levels) in top_level' 
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/application.rb:94:in `each' 
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/application.rb:94:in `block in top_level' 
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/application.rb:133:in `standard_exception_handling' 
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/application.rb:88:in `top_level' 
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/application.rb:66:in `block in run' 
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/application.rb:133:in `standard_exception_handling' 
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/application.rb:63:in `run' 
/Users/dave/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/bin/rake:33:in `<top (required)>' 
/Users/dave/.rvm/gems/ruby-1.9.3-p0/bin/rake:19:in `load' 
/Users/dave/.rvm/gems/ruby-1.9.3-p0/bin/rake:19:in `<main>' 
Tasks: TOP => import 
+0

あなたのシステムに 'FasterCSV'という宝石がインストールされていますか? – Surya

+1

そして、なぜあなたは 'FasterCSV' ** gem **を' CSV'の代わりに使っているのですか?教えてください** inbuiltクラスの** ruby​​?代わりに 'require 'csv''を試してみてください。 – Surya

+1

@ Suurya:1.9の標準csvはUTF-8のサポートが改善されたFasterCSVです.FastCSVの必要はありません。 –

答えて

2

Institutionモデルクラスがapp/modelsで定義されていることを確認してください。 s)(rake db:migrate)を使用して、モデルを作成するためにジェネレータ(または足場)を使用したと仮定して、機関テーブルを作成します。

+0

何が起こったのか分かりませんが、エラーは出ましたがデータベースは情報で更新されました...ありがとうございました。なぜ私はそれらを持って知っている場合は、エラーを再投稿しました。 – DaveG

3

のlib /タスク/ import.rake

require 'csv' 

desc "Import gac from csv file" 
task :import => [:environment] do 

    file = "vender/gac.csv" 

    CSV.foreach(file, :headers => true) do |row| 
    Putthemodelnamehere.create ({ 
     :columnnamewhatever => row[1], 
     :columnname => row[2], 
     :columnname => row[4] 
    }) 
    end 
end 

その後rake importを実行するか、exec rake importをバンドルするだけです。これは役に立ちます(これはfastercsvを使用していませんが、これが私が推奨する解決策です)。

+0

ジェフはあなたの答えを試しましたが、サイコロはありません...私が投稿した更新されたコードに関する提案はありますか?助けてくれてありがとう。 – DaveG

+0

ねえ、{}で試してみてください。それが動作するかどうか私に教えてください。 – jeffbricco

+0

ジェフ、私は{}を見逃していたので、それらを入れました...まだ実行されませんでした。上記のコードをエラーで更新しました。ありがとう! – DaveG

2

あなたのCSVには、UTF-8用に正しくエンコードされていないものがあるため、取得しているエラーが考えられます。

これを処理する1つの方法は、エンコードを強制することです。 、あなたは上記の持っているそれぞれの関連について

代わりに、次の操作を行います:あなたは、次の操作を行うことができ

:category_1 => row[3].encode("UTF-8", replace: ' '), 

うまくいけば、あなたのために働くだろうという。