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

1.21 jigowatts

Great Scott!

Ruby CSVの書き込みと読み込み

Tips

CSVの読み書き

require 'csv'

# 文字列への書き込み
csv_string = CSV.generate do |csv|
  csv << [1,'Alice',18]
  csv << [2,'BoB',21]
  csv << [3,nil,nil]
  csv << [4,"",""]
end

# 文字列からの読み込み
CSV.parse(csv_string) do |row|
  p row
end

puts "*" * 30
# ファイルへの書き込み
arr_of_arrs = [[1,'Alice',18],[2,'BoB',21],[3,nil,nil],[4,"",""],[5,'Catherine',34],[6,'Diana',46]]

CSV.open('output.csv','w') do |csv|
  arr_of_arrs.each do |arr|
    csv << arr
  end
end

# ファイルからの読み込み
CSV.foreach('output.csv') do |row|
  p row
end

NASAのデータを取り込んでみる

f:id:sh_yoshida:20161123031652p:plain

リファレンスマニュアルを読んで試してなんとなく動かせたので、先日知ったNASAのオープンデータをCSVで落として無駄に読み込んでみたくなりました。

open.nasa.gov

いろんなデータがあって、どれが何だかよくわからなかったので最も人気がありそうな隕石落下データを使ってみることに。

https://data.nasa.gov/Space-Science/Meteorite-Landings/gh4g-9sfh

Excelで開いてみるとこんな感じ。名前、質量、落ちた年、緯度、経度。あとはなんだろ、よくわかりませんが隕石のデータですね。4万5千件ほどあります。

f:id:sh_yoshida:20161123025458p:plain

Meteorite Landingsとかクソかっこいいデータだけど、CSVでExportしてきて読み込むだけで申し訳ない。

やっぱり生のデータを使うとうまく行かないことが出てきますね。エンコーディングでハマり、nilのデータでハマり、ヘッダーの扱い方、関係ないけど文字列のフォーマット指定での日時変換などだいぶ寄り道しちゃいました。

require 'csv'
require 'time'

# 一度に読み込み
csv_data = CSV.read('Meteorite_Landings.csv',headers: true,encoding: 'UTF-8')

target = Time.parse("1925/01/01")

puts csv_data.select{|row|
    unless row["year"].nil?
      Time.strptime(row["year"],"%m/%d/%Y") == target
    end
    }

実行してみると1925年の隕石情報が出ました!

f:id:sh_yoshida:20161123032308p:plain

NASAすごいです。