読者です 読者をやめる 読者になる 読者になる

私が歌川です

@utgwkk が書いている

RubyでCSVを扱うときの基礎の基礎

CSVファイルは、一言で言えばカンマ区切りの形式を持つファイルである。Excelなどの表計算ソフトで開いたり、編集したりできるが、分かりやすい構造なので、普通のテキストエディタでも編集できる。ログを記録するのにも便利。
RubyにはCSVファイルを扱うためのモジュールが用意されている。
それは、スクリプトの最初に、

require 'csv'

と書くことで使用することができる。
どんなことができるのか。
まずは、テキストエディタに次のように打ち込もう。

ルーミア,かわいい,かっこいい,りりしい,食欲
チルノ,向こう見ず,かわいい,氷

これをdata.csvという名前で保存しよう。違う名前にした場合は、次からのソースコードを適宜読み替えればよい。

まずは、普通に読み込もう。

#! ruby
require 'csv'

CSV.foreach("bo.csv") do |bo|
 print bo , "\n"
end

実行結果

["ルーミア","かわいい","かっこいい","りりしい","食欲"]
["チルノ","向こう見ず","かわいい","氷"]

変数boには一行分のデータが配列形式で格納される。それを一行ずつ出力する。each文のようになっているのである。

ということは、さらにeach文を入れ子にして、

#! ruby
require 'csv'

CSV.foreach("data.csv") do |bo|
 bo.each do |mo|
  puts mo
 end
end

としてやれば、

ルーミア
かわいい
かっこいい
りりしい
食欲
チルノ
向こう見ず
かわいい
氷

と、要素を一つずつ取り出すことができる。

もちろん、CSVファイルに書き込むこともできる。

#! ruby
require 'csv'

data = [
 ["ルーミア","かわいい","ちょおかわいい"],
 ["チルノ","かわいい","むっちょかわいい"]
]

CSV.open("bo.csv","wb") do |csv|
 data.each do |bo|
  csv << bo
 end
end

実行結果
ファイル bo.csv ができている。内容は、

ルーミア,かわいい,ちょおかわいい
チルノ,かわいい,むっちょかわいい

配列の中に配列? これは、二次配列と言う。たぶん。こうしてやると、bo.csv複数行書き込むことができる。

カンマで区切られた文字列を配列にする機能もある。ありがたい。

#! ruby
require 'csv'
bo = "a,b,c,d,e"
print CSV.parse_line(bo)

実行結果

["a","b","c","d","e"]

ところで、CSVはカンマ区切りと言った。では、

["ルーミア",",","ちょおかわいい"]

という配列を定義して、同じように書き込んだとき、CSVファイルの中身はどうなるのか?

ルーミア,,,ちょおかわいい

になりかねないが、これではおかしい。
心配無用。カンマの文字をダブルクォートしてくれるので、形式は保持される。
では、ダブルクォーテーションは? これも、ダブルクォーテーションをダブルクォートしてくれるので、心配ない。ややこしいが、要するに大丈夫。

基礎の基礎が怖いとマドンナも仰った。要はぼくもよく分かっていない。これ以降のことはるりま(Rubyリファレンスマニュアル)の該当ページを参照されたし。