要約
CSV (Comma Separated Values) を扱うライブラリです。
このバージョンの CSV ライブラリは FasterCSV から始まりました。 FasterCSV は Ruby1.8 に標準添付されている CSV ライブラリの置き換えとして開発されました。このライブラリはユーザの関心事を解決するためにデザインされています。主なゴールが三つあります。
- ピュア Ruby のままで元の CSV ライブラリよりもかなり速くすること
- 小さくメンテナンスしやすいコードベースであること (FasterCSV はかなり大きく 機能豊かになりました。構文解析部分のコードはかなり小さいままです)
- CSV のインターフェイスを改善すること
明らかに最後のものは主観的です。変更するやむを得ない理由が無い限り、オリジナルのインターフェイスに従うようにしたので、おそらく旧 CSV ライブラリとはあまり大きな違いは無いでしょう。
古い CSV ライブラリとの違い
大きな違いについて言及します。
CSV 構文解析
- このパーサは m17n に対応しています。CSV も参照してください
- このライブラリはより厳しいパーサを持っているので、問題のあるデータに対して CSV::MalformedCSVError を投げます
- 旧 CSV ライブラリよりも行末に関しては寛容ではありません。あなたが :row_sep としてセットした値が法です。 しかし、自動検出させることもできます
- 旧ライブラリでは空行に対して [nil] を返しますが、このライブラリは空の配列を返します
- このライブラリはかなり速いパーサを持っています
インターフェイス
- オプションをセットするのにハッシュ形式の引数を使うようになりました
- CSV#generate_row, CSV#parse_row はなくなりました
- 古い CSV::Reader, CSV::Writer クラスはなくなりました
- CSV.open はより Ruby らしくなりました
- CSV オブジェクトは IO の多くのメソッドをサポートするようになりました
- 文字列や IO のようなオブジェクトを読み書きするためにラップする CSV.new メソッドが追加されました
- CSV.generate は古いものとは異なります
- 部分読み出しはもうサポートしていません。読み込みは行単位で行います
- パフォーマンスのため、インスタンスメソッドでセパレータを上書き出来なくなりました。 CSV.new でセットするようにしてください。
CSV とは
CSV ライブラリは [RFC4180] から直接とられたかなり厳しい定義を維持します。一ヶ所だけ定義を緩和することでこのライブラリを使いやすくしています。CSV はすべての有効な CSV ファイルをパースします。
不正な CSV データを与えたくない。あるフィールドが不正であることが確定するのはファイルを全て読み込んだ後です。これは多くの時間やメモリを消費します。
Ruby の組込みメソッドはほとんど全ての点でより優れています。運が良ければ不正な CSV データを与えても動きます。例えば、クオートされていないフィールドだけを持つ CSV データは次のように簡単にパースできます。
data.split(",")
クラス
CSV | このクラスは CSV ファイルやデータに対する完全なインターフェイスを提供します。 |
CSV::Row | CSV::Row は配列やハッシュに似ています。 |
CSV::Table | CSV::Table は CSV ドキュメントを表す二次元のデータ構造です。行単位や列単位の操作を行うことが出来ます。また必要であれば CSV に戻すこともできます。 |
CSV::FieldInfo | 行が読み込まれたデータソース内でのフィールドの位置の情報を格納するための構造体です。 |
例外クラス
CSV::MalformedCSVError | 不正な CSV をパースしようとしたときに発生する例外です。 |