2017-01-25 9 views
0

나는 이번 주 초에 this 질문을했으며 잘 작동했습니다. 방금 약간 큰 스프레드 시트로 시도했지만 어떤 이유로 작동하지 않는 것 같습니다.CSV를 레일즈 데이터베이스로 가져 오기

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 

이 파일은 .XLSX하지만 shouldn보다는 CSV는 '다음과 같이

내 코드입니다 차이를 만들어라.

내가 잘못하고있는 아이디어가 있습니까?

+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}) 

모두 엑셀, 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

업데이트 된 답변을 확인하십시오. –