世界のやまさ

SEKAI NO YAMASA

Ruby 1.9.3 で CSV を加工したい

Web上のサンプルは1.8系の頃ばかりで割と少ない感じがしたので、メモしておく。

たとえば、以下のような CSV から Path と FileName カラムを 削除して、FilePath という一つのカラムに結合して、さらに Text の内容に改行を含めたい場合の例。 f:id:nnasaki:20130204005022j:plain

完成形はこんな感じ。 f:id:nnasaki:20130204005015j:plain

作成したコードは以下。ruby convert.rb blog.csv > convert.csv のように実行する。

ポイントは4つ

ハッシュのように扱える

:headers => true を指定することで、CSV の一行目のカラムを Key として、それぞれのフィールドを Value で使えます。左から何番目と指定する必要が無いので、CSV の形式が変わっても使えるのでとても便利

コマンドのように実行できる

CSV.filter を使用すると、第一引数を INPUT として扱い、OUTPUT は標準出力となります。これで、sedawk 等の感覚で実行できるスクリプトが簡単に作成できます。

ヘッダーの加工は注意が必要

ヘッダーだけ特別な加工をしたいので、if row.header_row? としています。next で以降の処理はさせずに次のループに移るようにしています。

MAC の場合、改行コード入力は ALT+¥ で入力すること

row["Text"] << "ああ\nええ" に改行コード \n を入れても改行できず、おっかしいなーと思ったら、ALTを押さないと円マーク(¥)になってしまい、バックスラッシュ(\)にならなかったためでした。

いつもはコンソールで irb でやっているので気づきませんでしたが、今回は Sublime Text 2 でエディタ使ってやってたら、はまってしまった。

2000行ぐらいならほぼ一瞬で済んでしまうようなので、良さそう。まだ自分の中でデータ加工する際の複数のハッシュキーを削除する方法とか、ハッシュではない普通の配列とシンボルとかがごちゃごちゃになってて Ruby 力の足りなさを痛感しました。