【ruby】csv読み込み操作
- wiki
- 【Ruby】CSVをデータベースのように扱う
- Ruby 2.7.0 リファレンスマニュアル
- 【Ruby入門】CSVファイルの読み込み・書き込み
CSVとは?
- Comma Separated Valueの略です。
- データがカンマ(,)で区切られていて拡張子が.csv
ヘッダ行
- ファイルの先頭には、オプションとして、通常のレコードと同一の書式の「ヘッダ行」があってもいい。ヘッダ行は、他のレコードと同じ個数のフィールドを持ち、フィールドの名称が書かれている。
ヘッダの注意点
- 日本語のヘッダは表示されない
- CSV.table では日本語のヘッダは表示されない
- ruby csv読み込み時に、ヘッダー情報を取得するには
- Ruby で CSV を扱う際に便利な gem である SmarterCSV
RubyからCSVを扱う
標準添付ライブラリがあるのでrequire 'csv'
で使える。
実際にやってみよう!
#sample.csv name,Mathematics,Science,English,Japanese,History Adam,100,80,60,50,40 Will,34,77,43,90,30 Alyssa,66,78,33,99,1 Eve,89,56,45,89,100 Emma,55,90,68,96,92 Carter,13,16,17,24,35 Gabrielle,55,78,56,54,57 Quinn,76,78,75,79,69 Catherine,99,96,90,94,89
CSVファイルの読み込み
一行ずつ読み込む(foreach)
# main.rb require 'csv' CSV.foreach("sample.csv") do |row| p row end
- ターミナルで
ruby main.rb
を実行
#結果 ["name", "Mathematics", "Science", "English", "Japanese", "History"] ["Adam", "100", "80", "60", "50", "40"] ["Will", "34", "77", "43", "90", "30"] ["Alyssa", "66", "78", "33", "99", "1"] ["Eve", "89", "56", "45", "89", "100"] ["Emma", "55", "90", "68", "96", "92"] ["Carter", "13", "16", "17", "24", "35"] ["Gabrielle", "55", "78", "56", "54", "57"] ["Quinn", "76", "78", "75", "79", "69"] ["Catherine", "99", "96", "90", "94", "89"]
p,puts違い
p・・・引数のオブジェクトをわかりやすく標準出力に出力。 デバッグ用です 文字列ならダブルクオートで囲まれる puts・・・引数のオブジェクトを文字列に変換し、改行を加えて標準出力に出力。
一列目を取り出す
- 配列なので要素の指定もできます。
# main.rb require 'csv' CSV.foreach("sample.csv") do |row| puts row[0] end
- ターミナルで
ruby main.rb
を実行
#結果 name Adam Will Alyssa Eve Emma Carter Gabrielle Quinn Catherine
全体を読み込む(read)
# main.rb require 'csv' p CSV.read("sample.csv")
- ターミナルで
ruby main.rb
を実行
#結果 [["name", "Mathematics", "Science", "English", "Japanese", "History"], ["Adam", "100", "80", "60", "50", "40"], ["Will", "34", "77", "43", "90", "30"], ["Alyssa", "66", "78", "33", "99", "1"], ["Eve", "89", "56", "45", "89 ", "100"], ["Emma", "55", "90", "68", "96", "92"], ["Carter", "13", "16", "17", "24", "35"], ["Gabrielle", "55" , "78", "56", "54", "57"], ["Quinn", "76", "78", "75", "79", "69"], ["Catherine", "99", "96", "90", "94", "89"] ]
- 二次元配列に値が格納されているのでより細かく抜き出せる
一行目を取り出す
# main.rb require 'csv' require 'csv' puts CSV.read("sample.csv")[0]
- ターミナルで
ruby main.rb
を実行
# 結果 name Mathematics Science English Japanese History
Adamを取り出す
# main.rb require 'csv' puts CSV.read("sample.csv")[1][0] #[行数][列数]
- ターミナルで
ruby main.rb
を実行
# 結果 Adam
tableメソッド
- tableメソッドは、「ヘッダー」「列」「行」の三つを取得できるメソッド
- これが一番便利らしい。
# main.rb require 'csv' csv = CSV.table("sample.csv") p csv.headers p csv[1] p csv[1][0] p csv[:name]
- ターミナルで
ruby main.rb
を実行
p csv.headers →[:name, :mathematics, :science, :english, :japanese, :history] p csv[1] →#<CSV::Row name:"Will" mathematics:34 science:77 english:43 japanese:90 history:30> p csv[1][0] →"Will" p csv[:name] →["Adam", "Will", "Alyssa", "Eve", "Emma", "Carter", "Gabrielle", "Quinn", "Catherine"]
応用編
# main.rb require 'csv' csv = CSV.table("sample.csv") p csv.size p csv[:science].sum p csv[:science].sum / csv.size p csv[0].size p csv[0][1..5].sum / 5 p csv[0][1..5].sum p csv[0][1..5] p csv[0][1..5].size
[length、size、count メソッドの違いまとめ【Ruby】](https://qiita.com/motoki4917/items/ffc89d955e20b91d1014) length と size は同じ。エイリアス。 機能としては下記のように配列の要素数、ハッシュの{key: value}のセット数、文字列の文字数を数値で返す。 全要素数、全{key: value}セット数、文字数を返す。それたけ。
結果 p csv.size 9 p csv[:science].sum 649 p csv[:science].sum / csv.size 72 p csv[0].size 6 p csv[0][1..5].sum / 5 66 p csv[0][1..5].sum 330 p csv[0][1..5] [100, 80, 60, 50, 40] p csv[0][1..5].length 5
追記
# main.rb require 'csv' csv = CSV.table("sample.csv") csv.size.times{|i| p csv[i][1..5] }
結果 [100, 80, 60, 50, 40] [34, 77, 43, 90, 30] [66, 78, 33, 99, 1] [89, 56, 45, 89, 100] [55, 90, 68, 96, 92] [13, 16, 17, 24, 35] [55, 78, 56, 54, 57] [76, 78, 75, 79, 69] [99, 96, 90, 94, 89]
この辺が限界ですね。