Rubyでファイルの操作をしてみよう③ [CSV編]


Rubyでファイルの操作をしてみよう③ [CSV編]

RubyはWebアプリケーションを作る以外にも、様々な用途で使用されています。その中でも使用頻度が高いのが、「ファイルの操作」です。

今回はRubyを使って、CSVファイルの読み込み・書き込みなど基本操作について解説していきます。

目次
  1. ファイル操作用のRubyファイルを作成しよう
  2. RubyでCSVファイルに書き込みをしよう(基礎編)
  3. RubyでCSVファイルに書き込みをしよう(応用編)
  4. RubyでCSVファイルの内容を読み込もう(基礎編)
  5. RubyでCSVファイルの内容を読み込もう(応用編)
  6. RubyでCSVファイルの内容を読み込もう(発展編)
  7. まとめ

ファイル操作用のRubyファイルを作成しよう

『CSV』ファイルとは、「comma separated values」の略称で、下記のように値や項目がカンマ(,)で区切られたデータです。

id,name,age
1,太郎,25
2,花子,22
3,次郎,21

CSVは余計なデータが入っていないので、容量が軽いため幅広い分野で使用されています。

CSVファイルを操作するRubyのファイルを作成していきます。ターミナルで下記コマンドを実行してください。

$mkdir file_practice_csv
$cd file_practice_csv/
$touch file_write.rb
$ls

//実行結果
file_write.rb

ここまででファイル操作用のコードを書くファイルが完成しました。Visual studio code(以降VScodeと呼ぶ)など、お使いのコードエディタで「file_practice_csv」ディレクトリを開きます。

またRubyがインストールされているか、下記コマンドを実行して確認してください。 バージョンが表示されていればOKです。

$ruby -v

//実行結果
ruby 2.6.5p114 (2019-10-01 revision 67812) [x86_64-darwin19]

RubyでCSVファイルに書き込みをしよう(基礎編)

本章では、特定のCSVファイルに書き込みを行う方法について解説していきます。まずは、コードエディタで「file_write.rb」を開き、下記コードを貼り付けてください。

require 'csv'

CSV.open('sample1.csv', 'w') do |f|
    f << ["ID", "Name", "Age"]
    f << ["1", "太郎", "25" ]
end

CSVファイルをRubyで扱うには、「require ‘csv’」という形で、csvというモジュールを読み込む必要があります。このモジュールを読み込むと、CSV.openというコードを使用できます。

上記コードは、空の「sample1.csv」というファイルを作成し、値を書き込む処理をおこなっています。ではターミナルで下記コマンドを実行して、「sample1.csv」が下記のような実行結果になるか確認してみましょう。

$ruby file_write.rb

//実行結果(sample1.csvの中身)
ID,Name,Age
1,太郎,25

csvファイルに指定した文字が書き込まれているのを確認できました。 次は「sample1.csv」に複数のデータを追加してみましょう。

「file_write.rb」を開き、下記コードを貼り付けてください。

require 'csv'

CSV.open('sample1.csv', 'w') do |f|
    f << ["ID", "Name", "Age"]
    f << ["1", "太郎", "25" ]
    f << ["2", "花子", "23" ]
    f << ["3", "次郎", "21" ]
end


コードを貼り付けたら、ターミナルで下記コマンドを実行して、「sample1.csv」に書き込まれるのを確認しましょう。

$ruby file_write.rb

//実行結果(sample1.csvの中身)
ID,Name,Age
1,太郎,25
2,花子,23
3,次郎,21

RubyでCSVファイルに書き込みをしよう(応用編)

次はもう少し応用的なCSVファイルの書き込みについて解説していきます。「file_practice_csv」ディレクトリに、「sample2.csv」と「file_write2.rb」を作成しましょう。

ファイルを作成できたら、「file_write2.rb」ファイルを開き、下記コードを貼り付けてください。membersには、1人1人のデータがハッシュとして格納されています。

require 'csv'

members = [
  { id: 1, name: '太郎', age: 25 },
  { id: 2, name: '花子', age: 23 },
  { id: 3, name: '次郎', age: 21 }
]

CSV.open('sample2.csv', 'w') do |f|
  members.each do |member|
    id = member[:id]
    name = member[:name]
    age = member[:age]
    f << [id, name, age]
  end
end

コードを貼り付けられたら、下記コマンドを実行して、membersの中身が「sample2.csv」に書き込まれているか確認してみましょう。

$ruby file_write2.rb

//実行結果(sample1.csvの中身)
1,太郎,25
2,花子,23
3,次郎,21

このように配列から、データを取り出して、CSVファイルに値を書き込むケースは非常に多いです。

RubyでCSVファイルの内容を読み込もう(基礎編)

本章では、CSVファイルの読み込みについて解説していきます。まずは「file_practice_csv」ディレクトリ配下に「file_read.rb」と「sample3.csv」を作成してください。

作成できたら、下記コードをそれぞれのファイルに貼り付けてみましょう。

[sample3.csv]

1,太郎,25
2,花子,23
3,次郎,21

[file_read.rb]

require 'csv'

CSV.foreach('sample3.csv') do |f|
  print f
end

ターミナルで下記コマンドを実行して結果を確認してください。 foreachメソッドを使うと、CSVファイルを1行ずつ読み込み、配列に格納しているのが分かります。

$ruby file_read.rb 

//実行結果
["1", "太郎", "25"]["2", "花子", "23"]["3", "次郎", "21"]

次はCSVファイルから取得したデータを編集して、表示してみましょう。 「file_read.rb」を開き、下記コードに変更してください。

require 'csv'

members = CSV.read('sample3.csv')
members.each do |member|
  id = member[0]
  name = member[1]
  age = member[2]
  puts "#{name}のIDは#{id}で、年齢は#{age}歳です。"
end

コードを貼り付けたら、ターミナルで下記コマンドを実行して結果を確認してみましょう。

$ ruby file_read.rb 

//実行結果
太郎のIDは1で、年齢は25歳です。
花子のIDは2で、年齢は23歳です。
次郎のIDは3で、年齢は21歳です。

このようにCSVファイルからデータを取得して、好きな形式に編集することもできます。

RubyでCSVファイルの内容を読み込もう(応用編)

今度はもう少し複雑なCSVファイルの読み込みを行っていきましょう。 まずは、「file_practice_csv」ディレクトリ配下に、「sample4.csv」と「file_read2.rb」を作成します。

ファイルを作成できたら、「sample4.csv」を開き下記を貼り付けてください。 今回用意するCSVファイルは、ある店の売り上げデータと仮定します。

1つ目の要素がメニュー名、2つ目が売れた個数です。各メニューの売上数の合計を算出してみましょう。

[sample4.csv]

焼肉弁当,10
唐揚げ弁当,30
ハンバーグ弁当,20
唐揚げ弁当,100
ハンバーグ弁当,20
唐揚げ弁当,15
幕の内弁当,5
のり弁当,25

次に「file_read2.rb」を開き、下記コードを貼り付けてください。 has_key?はハッシュの中に、特定のキーが存在するか確認できるメソッドです。

[file_read2.rb]

require 'csv'

sum = {}

menus = CSV.read('sample4.csv')
menus.each do |menu|
  name = menu[0]
  num = menu[1].to_i

  if sum.has_key?(name)
    sum[name] += num
  else
    sum[name] = num
  end
end

sum.each do |key, value|
    puts "#{key}は#{value}個売れました。"
end

コードを貼り付けたら、下記コマンドを実行して結果を確認してみましょう。

$ ruby file_read2.rb

//実行結果
焼肉弁当は10個売れました。
唐揚げ弁当は145個売れました。
ハンバーグ弁当は40個売れました。
幕の内弁当は5個売れました。
のり弁当は25個売れました。

メニュー毎の売り上げ数を表示することができました。

RubyでCSVファイルの内容を読み込もう(発展編)

最後に発展的なCSVファイルの操作について解説していきます。 まずは、「file_practice_csv」ディレクトリ配下に、「sample5.csv」と「file_read3.rb」ファイルを作成してください。

使用するCSVデータの要素は、左から順に「メニュー名」「売上数」「単価」とします。各メニューの売り上げの合計を算出してみましょう。

[sample5.csv]

焼肉弁当,10,850
唐揚げ弁当,30,650
ハンバーグ弁当,20,700
唐揚げ弁当,100,650
ハンバーグ弁当,20,700
唐揚げ弁当,15,650
幕の内弁当,5,1200
のり弁当,25,400

次に「file_read3.rb」ファイルを開き、下記コードを貼り付けてください。

[file_read3.rb]

require 'csv'

sum = {}

menus = CSV.read('sample5.csv')
menus.each do |menu|
  name = menu[0]
  num = menu[1].to_i
  price = menu[2].to_i
  sum_price = num * price

  if sum.has_key?(name)
    sum[name] += sum_price
  else
    sum[name] = sum_price
  end
end

puts sum

sum.each do |key, value|
  puts "#{key}は#{value}円売れました。"
end

最後にターミナルを開き、下記コマンドを実行して結果を確認してみましょう。

$ ruby file_read3.rb 


//実行結果
{"焼肉弁当"=>8500, "唐揚げ弁当"=>94250, "ハンバーグ弁当"=>28000, "幕の内弁当"=>6000, 
"のり弁当"=>10000}

焼肉弁当は8500円売れました。
唐揚げ弁当は94250円売れました。
ハンバーグ弁当は28000円売れました。
幕の内弁当は6000円売れました。
のり弁当は10000円売れました。

メニュー毎の売り上げを正しく算出できました。

Rubyでのサービス開発スキルが身に付く

CodeCampの無料体験はこちら

まとめ

Rubyを使ったCSVファイルの読み込み・書き込み操作について解説しました。実務で使用されるCSVのデータは膨大である場合が多く、人間が処理するのに時間がかかり大変な作業です。

本記事で紹介した方法を使用すると、データの量が多くなったとしても、自動でRubyが処理を行ってくれるので、業務を効率化できます。業務や普段の生活でCSVを扱う際は、積極的にRubyを使ってみてはいかがでしょうか。


関連記事

ヤマモト
この記事を書いた人
ヤマモト
\ 無料体験開催中!/自分のペースで確実に習得!
オンライン・プログラミングレッスンNo.1のCodeCamp