読者です 読者をやめる 読者になる 読者になる

ぼろぼろ平原

困った

Rubyで大きいファイルを読み込む時に進捗を表示

f:id:tatzyr:20160713144219g:plain

進捗を表示するためには、ファイル全体の行数かファイルサイズが必要になる。

ファイルの行数を取得するにはファイルを一度全部読み込む必要があり、大きいファイルだと時間がかかるのでダメ。

一方、ファイルのサイズはFileTest.sizeを使えば一瞬で取得できる。 また、IO#posを使うとファイルポインタの現在の位置が取得できるので、現在の進捗が計算できる。

プログレスバーの表示には ruby-progressbar というgemを使う。

ruby-progressbarのインストール

$ gem install ruby-progressbar

進捗を表示するプログラム

require "ruby-progressbar"

# 大きいファイルのファイル名
filename = "sugoku_dekai_file.txt"

# ファイルのサイズを取得しProgressBarを作成
progressbar = ProgressBar.create(total: FileTest.size(filename))

# ファイルを開いて行ごとに処理
open(filename) do |f|
  f.each_line do |line|
    # lineに対してなにか処理
    foo(line)

    # 進捗を更新
    progressbar.progress = f.pos
  end
end

# 進捗を100%にする
progressbar.finish