元ひよっこSEがフルスタックエンジニアを目指すブログ

大学院(情報系)修了後、新卒で大手SIer入社。のちに事業会社(WEB系)に転職。SIerから事業会社に転職してからの日常と学んだこととかを書いていこうかと思う。

【Ruby】標準出力でかっこよく進捗を表示する

 すごい長い時間処理をするプログラムを作っていたのですが、どこまで処理をできたかのフィードバックが欲しいと思い調べてみました。
標準出力で処理回数を表示してたのですがいかんせんイケてなかったので、イケてる表示方法を調べてみました。

普通に表示する

普通に進捗を表示してみる。

max = 10000
(1..max).each{|num|
  puts "#{num}/#{max} Progress rate: #{num*100/max}%"
}

下記のように残念な感じになる。

1/10000 Progress rate: 0%
2/10000 Progress rate: 0%
3/10000 Progress rate: 0%
4/10000 Progress rate: 0%
5/10000 Progress rate: 0%
6/10000 Progress rate: 0%
7/10000 Progress rate: 0%
8/10000 Progress rate: 0%
9/10000 Progress rate: 0%
10/10000 Progress rate: 0%
・
・
・
9990/10000 Progress rate: 99%
9991/10000 Progress rate: 99%
9992/10000 Progress rate: 99%
9993/10000 Progress rate: 99%
9994/10000 Progress rate: 99%
9995/10000 Progress rate: 99%
9996/10000 Progress rate: 99%
9997/10000 Progress rate: 99%
9998/10000 Progress rate: 99%
9999/10000 Progress rate: 99%
10000/10000 Progress rate: 100%

キャリッジリターン(\r)を使う

先頭に"\r"を付けると、標準出力が上書きされる。

max = 10000
(1..max).each{|num|
  print "\r#{num}/#{max} Progress rate: #{num*100/max}%"
 sleep(0.01)
}

下記のように進捗が1行で表示される。かっこいー。

3516/10000 Progress rate: 35%