読者です 読者をやめる 読者になる 読者になる

Rubyの勉強(2)

前回の続きです!
前回:Rubyの勉強(1) - usmysaの開発メモ

それでは、さっそく気温データのCSVファイルをRubyで読み込んで、データベースに追加したいと思います。

CSVファイルが読み込めない!

for csv_i in 1..15 do
  filename = "data-" + csv_i.to_s + ".csv"
  csvData = CSV.read(filename)
end

15個あるCSVファイルをfor文を使って、読み込もうとしたら

# ruby setDB_weatherData.rb 
/usr/local/rbenv/versions/2.3.1/lib/ruby/2.3.0/csv.rb:2016:in `=~': invalid byte sequence in UTF-8 (ArgumentError)
	from /usr/local/rbenv/versions/2.3.1/lib/ruby/2.3.0/csv.rb:2016:in `init_separators'
	from /usr/local/rbenv/versions/2.3.1/lib/ruby/2.3.0/csv.rb:1538:in `initialize'
	from /usr/local/rbenv/versions/2.3.1/lib/ruby/2.3.0/csv.rb:1273:in `new'
	from /usr/local/rbenv/versions/2.3.1/lib/ruby/2.3.0/csv.rb:1273:in `open'
	from /usr/local/rbenv/versions/2.3.1/lib/ruby/2.3.0/csv.rb:1339:in `read'
	from setDB_weatherData.rb:19:in `<main>'

というエラーが表示されました。
「invalid byte sequence in UTF-8 (ArgumentError)」っていうことは、utf-8じゃないから問題が発生してるのかな?

原因

このCSVファイルをどうやって作ったかは分からないですが、
Excelで作ったCSVSJISとして保存されるようです。
Excelで作った場合だと、終端文字が"\r\n"になるそうです。
その結果、エラーが発生してうまくいってないようです。

解決策

CSV.foreach('CSVファイル名', headers: true, row_sep: "\r\n", encoding: "SJIS") do |row|
  puts row[0] #rowの0番目を表示
end

ちなみに、「row_sep」とは行区切り文字列として使用する文字列を返すメソッドらしいです。

参考:Rails3でExcelで作ったSJISのCSVファイルをUTF-8で読み込む方法 - temitaの不思議空間
   ライブラリ:csv > クエリ:row_sep > バージョン:1.9.3 | るりまサーチ (Ruby 1.9.3)
  

何とか解決できたので、はやくデータベースに追加して
夜ご飯を食べたい…