「最近入ってきたユーザーのデータがちょっと欲しいんだけど...」
等と言って、特にエンジニア以外のPMだったりビジネスサイドの人に、Excelで見られるデータを求められることってないですか?
そのくらいお安いご用と言いたいけれど、実際、
- 本番の最新のデータを元に、csvとかxls形式のファイルを吐き出して、ローカルに持ってくるのは意外とめんどい。
- RubyのCSVモジュールがあんまりイケてなくて、
to_csv
みたいに扱えないので、コード書くのも意外とめんどい。
みたいなことがあります。
こんなときに作っておくといいのが、Arrayクラスについたto_tsv
メソッド。
to_csv
ではなくto_tsv
なことがミソ。TSVだとExcelにコピペできます。
array.rb
require 'csv'
class Array
def to_tsv
CSV.generate(col_sep: "\t") do |csv|
self.each do |x|
csv << (x.kind_of?(Enumerable) ? x.map(&:to_s) : [x])
end
end
end
end
これさえあれば、
「最近入ってきたユーザーのデータがちょっと欲しいんだけど...」
と言われたら、おもむろにProductionサーバーでコンソールを叩いて、
irb(main):001:0> puts User.last(100).map(&:attributes).map(&:values).to_tsv
とやって出てきた出力をコピーした上で、Excelにペーストするだけ。
ちなみにCSVライブラリを使ってTSVをはいているのは、改行や"が含まれるデータに正しく対応するため。
あまりそういうことを気にせず、require 'csv'
するのを嫌うんだったら以下のコードでもいいかも。
array.rb
class Array
def to_tsv
self.map { |x| x.kind_of?(Enumerable) ? x.map(&:to_s).join("\t") : x }.join("\n")
end
end