Ruby

データを整形出力する

CSV形式で与えられたデータ(文字列)を整形して出力するプログラムです。データの1行目,2行目は固定とし、3行目以降のデータは行数も含めて常に変化すると想定しています。Stringクラスのeach_line,split,ljust,rjust,centerメソッド、さらにはmatchやstripまで駆使した本格的(?)な感じになっちゃいました。

format.rb
data = <<EOT
== Sales report ==
Name,Number,Amount
Nakanishi,100,10000
Yagi,200,20000
Hamada,300,30000
Itou,400,40000
EOT

COL_WIDTH = 18

iter = data.each_line
puts iter.next.strip.center(COL_WIDTH * 3 + 4)

h_border = ""
iter.next.split(",").count.times do
  h_border += "+"+("-" * COL_WIDTH)
end
h_border += "+"
puts h_border

iter.each_with_index do |line,i|
  next if i == 0
  puts h_border if i == 2
  line.split(",").each do |v|
    print "|"
    if v.match(/^[0-9]+$/)
      print v.strip.rjust(COL_WIDTH)
    else
      print v.strip.ljust(COL_WIDTH)
    end
  end
  puts "|"
end

puts h_border

以下は実行例です。

$ ruby format.rb
                    == Sales report ==
+------------------+------------------+------------------+
|Name |Number |Amount |
+------------------+------------------+------------------+
|Nakanishi | 100| 10000|
|Yagi | 200| 20000|
|Hamada | 300| 30000|
|Itou | 400| 40000|
+------------------+------------------+------------------+

参考URL