CSVでファイルを保存するなら、jsonで保存する方が楽ということに気づいた

CSVでhashの値を保存する場合分解しないといけないじゃないですか?

めんどくさいですよね。

例えばこういうデータです。

class FooApi
  HEADER = %w(foo bar baz)

  def export
    CSV.open('foo.csv', 'w:utf-8', headers: HEADERS, write_headers: true, force_quotes: true) do |csv|
      results.each do |result|
        line = [
          result[:foo],
          result[:bar],
          result[:baz]
        ]
        csv.puts line
      end
    end
  end

  private

  def results
    [ {
        foo: 1,
        bar: 2,
        baz: [1, 2]
      },
      {
        foo: 3,
        bar: 4,
        baz: [3, 4]
      },
    ]
  end
end

これよりももっとカラムが増えることなんて多いですよ。

HEADERとか考えるのめんどくさいなって思いました。

そこでjsonで書き出せば何も考えなくていいことに気づきました。

  def export
    FIle.open('foo.json', 'w') { |f| f.puts results }
  end

これで全てが終わります。

  def import
    @x = open('foo.json') {|f| JSON.load(f)}
  end

JSONの場合、keyがStringになって嫌だ!ってことがあると思います。

そんな時のためのwith_indifferent_accessです。

ActiveSupport頼みになりますが、これでアクセスできるようになります。

  @x.map!(&:with_indiffrent)access)

もちろん、クライアントによってはjsonって何?ってお客さんも多いでしょう。

ただ、自分の作業やjsonの意味がわかる人なら、ガンガン使うべきだなって思いました。

以上です。