50
49

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

「ちょっとExcelで解析したいからデータ出して」と言われた時のためのArray#to_tsv

Posted at

「最近入ってきたユーザーのデータがちょっと欲しいんだけど...」
等と言って、特にエンジニア以外の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
50
49
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
50
49

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?