Импорт базы данных CSV в Rails
Я задал этот вопрос ранее на этой неделе, и он работал нормально. Я только попробовал это с немного большей таблицей, и это, кажется, не работает по некоторой причине.
Мой код выглядит следующим образом:
require 'roo'
xlsx = Roo::Spreadsheet.open(File.expand_path('../Downloads/unistats/LOCATION.csv'))
xlsx.each_row_streaming(offset: 1) do |row|
Location.find_or_create_by(ukprn: row[0].value, accomurl: row[1].value, instbeds: row[3].value, instlower: row[4].value, instupper: row[5].value, locid: row[6].value, locname: row[7].value, lat: row[9].value, long: row[10].value, locukprn: row[11].value, loccountry: row[12].value, privatelower: row[13].value, privateupper: row[14].value, suurl: row[15].value)
end
Но, в отличие от прошлого раза, это приводит к этой ошибке:
NoMethodError: undefined method `each_row_streaming' for #<Roo::CSV:0xb9e0b78>
Did you mean? each_row_using_tempdir
Этот файл скорее CSV, чем.xlsx, но это не должно иметь значения.
Есть идеи, что я делаю не так?
1 ответ
Это действительно имеет значение, что вы пытаетесь прочитать файл CSV, используя методы Excel.
Выдержки из Roo
документация.
# Load a CSV file
s = Roo::CSV.new("mycsv.csv")
# Load a tab-delimited csv
s = Roo::CSV.new("mytsv.tsv", csv_options: {col_sep: "\t"})
# Load a csv with an explicit encoding
s = Roo::CSV.new("mycsv.csv", csv_options: {encoding: Encoding::ISO_8859_1})
Отличный способ прочитать файлы Excel и CSV - сделать что-то вроде
if File.extname(filename).start_with?('xls')
workbook = Roo::Excel.new(filename)
else
workbook = Roo::CSV.new(filename)
end
workbook.default_sheet = workbook.sheets[0]
(workbook.first_row..workbook.last_row).each do |line|
...
end