技術系ブログ

とにかく小ネタで

【ruby】csv読み込み操作

RubyからCSVを扱う

標準添付ライブラリがあるのでrequire 'csv'で使える。

実際にやってみよう!

  • ローカル環境にmain.rbsample.csvを同じディレクトリに作成
  • sample.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]

この辺が限界ですね。