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のデータを取り込んでみる
リファレンスマニュアルを読んで試してなんとなく動かせたので、先日知ったNASAのオープンデータをCSVで落として無駄に読み込んでみたくなりました。
いろんなデータがあって、どれが何だかよくわからなかったので最も人気がありそうな隕石落下データを使ってみることに。
https://data.nasa.gov/Space-Science/Meteorite-Landings/gh4g-9sfh
Excelで開いてみるとこんな感じ。名前、質量、落ちた年、緯度、経度。あとはなんだろ、よくわかりませんが隕石のデータですね。4万5千件ほどあります。
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年の隕石情報が出ました!
NASAすごいです。