2017-01-25 222 views
0

本週早些時候我問了​​問題,它工作正常。我只是用一個稍大的電子表格來嘗試它,但由於某種原因,它似乎不起作用。將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但不該」沒有什麼不同。

任何想法我做錯了什麼?

+0

爲什麼不應該有所作爲? –

+0

由於Roo gem文檔聲明它適用於兩種文件類型。使用'header = xlsx.row(1)'它顯示所有的列都在預期的位置。 –

+0

對,它可以打開它,但你必須使用不同的方法來讀取值。 –

回答

0

實際上,您嘗試使用Excel方法讀取CSV文件是有區別的。

摘自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

檢查我的更新答案。 –