2017-01-25 8 views
0

Я задал вопрос this на этой неделе, и он отлично работал. Я просто попробовал это с чуть большей таблицей, и по какой-то причине она не работает.Импорт базы данных 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, но тот не должен» t сделать разницу.

Любые идеи, что я делаю неправильно?

+0

Почему бы это сделать разницу? –

+0

Поскольку в документе Roo gem указано, что он работает с обоими типами файлов. Используя 'header = xlsx.row (1)', он показывает, что все столбцы находятся в ожидаемом месте. –

+0

Правильно, он может открыть его, но вы должны использовать другой метод для чтения значений. –

ответ

0

На самом деле имеет значение, что вы пытаетесь прочитать файл 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 
+0

Тогда я попробую. –

+0

Есть ли у вас какие-либо советы относительно того, как я могу поместить это в инструкцию 'each do'? –

+0

Проверьте обновленный ответ. –

 Смежные вопросы

  • Нет связанных вопросов^_^