添付ライブラリの CSV クラスで標準入力からデータを受け付けるようにする

趣旨

Ruby 標準添付ライブラリの CSVクラスCSV ファイルの読み書きに便利である。ただ残念なことに標準入力からデータを受け付けてくれない。UNIX のフィルタ的コマンドを作ろうというときには、不便だ。
そこで、標準入力からデータを受け付けるようなパッチを書いてみた。

パッチ

コードは以下のとおり。

require 'csv'

class CSV
  def self.open_reader(path, mode, fs, rs, &block)
    file = path == '-' ? STDIN : File.open(path, mode)
    if block
      begin
        CSV::Reader.parse(file, fs, rs) do |row|
          yield(row)
        end
      ensure
        file.close
      end
      nil
    else
      reader = CSV::Reader.create(file, fs, rs)
      reader.close_on_terminate
      reader
    end
  end
end


# 例
# 仮に標準入力から "a,b" という文字列が入ってくると・・・
CSV.foreach('-') do |line|
  puts line.inspect
end
# => ["a", "b"]

ファイル名として '-' を指定すると、標準入力からデータを読み込めという指示になる。