Rubyを使ったアナログ化

下リンクの逆変換を行う内容である。Rubyのデータ構造をテキスト化する。

yumayxx.hateblo.jp

Rubyのデータ構造

data = [
  {:id => "a", :val1 => [1, 2, 3], :val2 => [3, 4]},
  {:id => "b", :val1 => [0], :val2 => [9, 8, 7]}
]

変換後のテキスト

id val1 val2
a 1 3
2 4
3
b 0 9
8
7

変換スクリプト

data = [
  {:id => "a", :val1 => [1, 2, 3], :val2 => [3, 4]},
  {:id => "b", :val1 => [0], :val2 => [9, 8, 7]}
]

# ヘッダーを出力
puts data.first.keys.join("\t")

# データを処理して表形式に出力
data.each do |entry|
  id = entry[:id]
  val1 = entry[:val1]
  val2 = entry[:val2]
  
  # val1 と val2 の要素数の最大値を取得して、ループをその回数だけ繰り返す
  max_length = [val1.length, val2.length].max
  max_length.times do |i|
    # idの値は最初の行のみ表示し、それ以外の行は空白にする
    id_output = (i == 0 ? id : "")
    
    # val1 と val2 の要素があれば出力し、なければ空白を表示
    val1_output = (val1[i].nil? ? "" : val1[i])
    val2_output = (val2[i].nil? ? "" : val2[i])
    
    puts [id_output, val1_output, val2_output].join("\t")
  end
end
  • 値が存在しない場合は、""を代入するところがポイント

出力結果

id   val1    val2
a   1   3
    2   4
    3   
b   0   9
        8
        7

ひどいな。ひどい世の中だ。