从Excel电子表格中将数据提取到Ruby中的数据库

时间:2017-01-24 10:15:54

标签: ruby-on-rails ruby database import-from-excel

我希望从Rails应用程序的电子表格中提取大量数据,但我正在通过Rails控制台进行提取。

我的数据库中有一个名为instititutes的表,目前有大约170条记录。我在包含c.1000记录的电子表格中找到了更好的数据,并希望将其导入我的数据库,但要跳过已经匹配的任何记录。

我认为使用find_or_create_by方法是最好的方法。电子表格以UKPRNNAME作为标题,表格中包含ukprnname作为相应列(以及其他列)。

使用Roo gem,到目前为止我已经得到了这个:

require 'roo'

xlsx = Roo::Spreadsheet.open(File.expand_path('../Downloads/UKPRN.xlsx'))
xlsx.default_sheet = xlsx.sheets.last
header = xlsx.row(1)
xlsx.each_row do |row|
    row = Institute.find_or_create_by(UKPRN: ukprn , NAME: name)
end

这是错误NameError: unitialized constant UKPRN。我仍然回到Ruby,所以任何帮助都会受到赞赏。

我使用的是Ruby 2.2.3和Rails 5.0.1

编辑:

p row显示:

["UKPRN", "NAME"]
[10000291, "Anglia Ruskin University"]
[10000385, "The Arts University Bournemouth"]
[10000571, "Bath Spa University"]
[10000712, "University College Birmingham"]
[10000824, "Bournemouth University"]
[10000886, "The University of Brighton"]
[10000961, "Brunel University London"]
...etc

1 个答案:

答案 0 :(得分:1)

您的表格各自列有ukprnname,因此find_or_create应如下所示:

Institute.find_or_create_by(ukprn: ukprn , name: name)

现在您只需要从ukprn初始化namerow

require 'roo'

xlsx = Roo::Excelx.new(File.expand_path('../Downloads/UKPRN.xlsx'))

xlsx.each_row_streaming(offset: 1) do |row|
  Institute.find_or_create_by(ukprn: row[0].value, name: row[1].value)
end

要执行此代码,请执行以下操作:

  • 将其放入db/seeds.rb并执行rake db:seed
  • 将其放入script.rb并运行rails runner script.rb
  • 将其复制粘贴到控制台(不是真的推荐)