どうも、フリーエンジニアの長瀬です。
CSVファイルは開発をする上でよく使われるデータ形式で、さまざまなプログラミング言語でデータの取得や書き込みをするときに利用されています。
今回はRubyでのcsvの扱い方について解説していきます。
この記事ではそんなCSVについて
【基礎】csvの読み込み
【基礎】csvの書き込み
【発展】tableメソッドの使い方
【発展】generateメソッドの使い方
の章に分けて基礎からしっかり解説を行っていきます。
それでは行ってみましょう!
そもそもcsvとは
それでは「csvってなんやねん!!」という方のためにcsvについて解説していきたいと思います。
csvとはざっくり言うと「データがカンマ(,)で区切られていて拡張子が.csv」のファイルです。
というのも、CSVはComma Separated Value(カンマで分けられた値)の略だからです。
なんのひねりもありません。
例えば、
「ruby,python,java,php,c++」
というファイルがあり、それの拡張子が.csvならそれはcsvファイルです。
あまり難しく考えず
- カンマで区切られている
- 拡張子が.csv
という二点をクリアしていればcsvと認識して大丈夫です!
Rubyでcsvを扱う際はcsvというライブラリをrequireすることで操作がとても簡単になるので覚えておくようにしましょう。
また今回は以下のようなsample.csvを用いて解説を行っていきます。
language,product ruby,web_application python,AI java,business_application
csvの読み込み
一行ずつ読み込む(foreach)
まずはcsvを一行ずつ読み込む方法について解説していきます。
一行ずつ読み込むためには「foreachメソッド」を使用します。
require 'csv' CSV.foreach("sample.csv") do |row| p row end
[実行結果]
["language", "product"] ["ruby", "web_application"] ["python", "AI"] ["java", "business_application"]
上のようにブロック内で一行ずつ配列としてcsvが読み込まれていることがわかります。
配列なので、要素を指定することも当然できます。
例えば一列目だけ取り出したい場合は[0]をつけて
require 'csv' CSV.foreach("sample.csv") do |row| p row[0] end
[実行結果]
"language" "ruby" "python" "java"
このように取り出せます。
文字列のcsvを読み込む(parse)
文字列のcsvを読み込む場合は「parseメソッド」を使います。
require 'csv' CSV.parse('ruby,python,java') do |row| puts row end
[実行結果]
ruby python java
このようにparseメソッドで、文字列のcsvが読み込めます。
全体を読み込む(read)
次にcsv全体を読み込む方法です。
csvを全体で読み込むためには「readメソッド」を使用します。
require 'csv' p CSV.read("sample.csv")
[実行結果]
[["language", "product"], ["ruby", "web_application"], ["python", "AI"], ["java", "business_application"]]
上のように二次元配列に値が格納されていることがわかります。
二次元配列なので例えば以下のように要素を取り出すことができます。
require 'csv' p CSV.read("sample.csv")[0] p CSV.read("sample.csv")[1][0]
[実行結果]
["language", "product"] "ruby"
csvの書き込み
次にcsvの書き込みについて見ていきましょう!
csvの書き込みには「openメソッド」を使用します。
require 'csv' CSV.open("write-sample.csv", "w") do |test| test << ["language", "product"] test << ["ruby", "web_application"] test << ["python", "AI"] test << ["java", "business_application"] end
openメソッドで、
・第一引数に書き込むファイルを指定
・第二引数に書き込みモード「w」を指定
これでwrite-sample.csvというファイルが作成され、配列の内容が入力されます。
[書き込まれたwrite-sample.csv]
language,product ruby,web_application python,AI java,business_application
応用的な使い方
tableメソッド
csvのメソッドで便利ですが、あまり知られていないメソッドがあります。
それが「tableメソッド」です。
tableメソッドには三つの便利な機能があります。
- ヘッダーの取得
- 列の取得
- 行の取得
それではサンプルコードを見ていきましょう。
require 'csv' csv = CSV.table("sample.csv") p csv.headers p csv[1] p csv[:language]
[実行結果]
[:language, :product] # ["ruby", "python", "java"]
このように上記に挙げた値が取得できていることがわかります。
csv形式に変換する(generate)
「generateメソッド」を使うと、簡単にcsv形式のデータを生成することができます。
require 'CSV' headers = ["language","product"] rows = [["ruby","web_application"], ["python", "AI"], ["java", "business_application"]] csv_data = CSV.generate() do |csv| csv << headers rows.each do |row| csv << row end end p csv_data
[実行結果]
"language,product\nruby,web_application\npython,AI\njava,business_application\n"
このようにヘッダーと行をそれぞれ直感的にcsvデータ化できました。
注意すべき点は変換したデータをファイルに保存しているわけではないということです。
generateメソッドは純粋な変換メソッドなのです。
まとめ
今回はRubyのcsvの扱い方について解説していきました。
csvライブラリをrequireすることでとても簡単にcsvを扱えることがわかりました!
まとめると
・csvを読み込むなら、foreach、parse、read、table
・csvを書き込むなら、open
・csvデータに変換するならgenerate
となります。
それぞれに使い所があるので、適材適所使えるようになりましょう。
この記事を参考に是非csvマスターになってください!