Ruby on Rails Импорт CSV в MySQL

Вопрос новичка....

Пытаюсь запустить проект на рельсах. У меня есть разные электронные таблицы в формате csv, которые я хотел бы импортировать в базу данных MySQL, чтобы иметь возможность манипулировать данными.

Посмотрев на stackoverflow, Google и т. д., я написал задачу rake, требующую, чтобы fastcsv выполнял эту работу. Я продолжаю получать ошибки, поэтому, надеюсь, вы можете помочь.

... Хорошо, поэтому я изменил код, чтобы использовать "csv" вместо "fastercsv"... все равно возникают ошибки. Смотри ниже

Новый код для Rake File (дубль 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

person DaveG    schedule 19.01.2012    source источник
comment
В вашей системе установлен FasterCSV gem?   -  person Surya    schedule 19.01.2012
comment
И не могли бы вы сказать мне, почему вы используете FasterCSV gem вместо CSV встроенного класса ruby?? Попробуйте: require 'csv' вместо этого?   -  person Surya    schedule 19.01.2012
comment
@Surya: Правильно, стандартный csv 1.9 в значительной степени FasterCSV с улучшенной поддержкой UTF-8, в FasterCSV нет необходимости, если вы не застряли на 1.8.   -  person mu is too short    schedule 19.01.2012
comment
Ничего себе .. вы, ребята, быстро. Спасибо. Да, я установил гем FasterCSV и сейчас пытаюсь изменить команду rake с ответом ниже, используя csv вместо fastcsv.   -  person DaveG    schedule 19.01.2012
comment
Действительно ли lib/tasks/import.rake является первой строкой вашего скрипта или это просто фрагмент метаинформации, говорящий нам, где находится ваш скрипт на диске?   -  person Cody Caughlan    schedule 19.01.2012
comment
lib/tasks/import.rake была первой строкой, которую я удалил, смотрите обновленный код и ошибки выше.   -  person DaveG    schedule 19.01.2012
comment
Почему бы не использовать функцию импорта вашей базы данных?   -  person Gareth    schedule 20.01.2012
comment
Судя по ошибке, похоже, что это проблема с кодировкой - вы уверены, что электронная таблица закодирована в UTF-8?   -  person Mando Escamilla    schedule 20.01.2012


Ответы (3)


Убедитесь, что у вас есть класс модели Institution, определенный в app/models, и/или убедитесь, что вы запустили миграцию(и) базы данных (rake db:migrate) для создания таблицы учреждений - при условии, что вы использовали генератор (или каркас) для создания модели.

person Michael Durrant    schedule 19.01.2012
comment
Я не уверен, что произошло, я получил ошибки, но база данных была обновлена ​​​​информацией ... Огромное спасибо. Я перепостил ошибки, если вы знаете, почему я их получил. - person DaveG; 20.01.2012

библиотека/задачи/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 или package exec rake import. Надеюсь, это поможет (это не использует fastcsv, но это решение, которое я бы порекомендовал).

person jeffbricco    schedule 19.01.2012
comment
Джефф только что попробовал ваш ответ, но не играл в кости ... какие-либо предложения по обновленному коду, который я опубликовал? Большое спасибо за помощь. - person DaveG; 19.01.2012
comment
Джефф, я пропустил {} , поэтому вставил их... все равно не запустил. Я обновил свой код выше с ошибками. Спасибо! - person DaveG; 20.01.2012
comment
jeffbrico, это действительно имя модели, т.е. это рельсы, а не SQL, и в именах моделей Rails они начинаются с верхнего регистра :) - person Michael Durrant; 20.01.2012
comment
Итак, Дэйв Г., пожалуйста, убедитесь, что у вас есть класс модели, определенный в app/models, и убедитесь, что вы запустили миграцию для создания таблицы учреждений (которая должна быть строчной и множественной, как это делается на рельсах). - person Michael Durrant; 20.01.2012

Ошибки, которые вы получаете, вероятно, связаны с тем, что в вашем csv есть что-то, что неправильно закодировано для UTF-8.

Одним из способов справиться с этим было бы принудительное кодирование. Вы можете сделать следующее:

Вместо этого для каждой ассоциации, указанной выше, сделайте следующее:

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

Надеюсь, это сработает для вас.

person Jonathon Jones    schedule 06.03.2012