CSVの追加書き込み
Rubyに標準添付されているCSVライブラリですが、なぜか追記がサポートされていないようなのでちょっと改造してみました。以下のコードをロードすると、CSV.openのmodeとして「a」,「ab」が指定できるようになります。
require 'csv' # 追記をサポートするように改造。 class << CSV alias_method( :open_org, :open ) def open( path, mode, fs=nil, rs=nil, &block ) if mode == "a" || mode == "ab" open_writer( path, mode, fs, rs, &block) else open_org( path, mode, fs=nil, rs=nil, &block ) end end end
使い方例。
# 追記 CSV.open( "./test.csv", "a" ){ |csv| csv << ["a", "aa", "aaa"] csv << ["b", "bb", "bbb"] } puts "---" CSV.open( "./test.csv", "r") {|row| puts row.join(",") } # さらに追記 CSV.open( "./test.csv", "a" ){ |csv| csv << ["c", "cc", "ccc"] csv << ["d", "dd", "ddd"] } puts "---" CSV.open( "./test.csv", "r") {|row| puts row.join(",") }
実行結果です。
--- a,aa,aaa b,bb,bbb --- a,aa,aaa b,bb,bbb c,cc,ccc d,dd,ddd
内部的にはCSV.open内での引数チェックを回避するようにしただけ。これでcsvファイルを開く時のmodeとして「a」や「ab」が渡されるようになります。一応ちゃんと動作している様子。