世界はまわると言うけれど

呼吸法、コーヒー、占いなど日々感じたことを綴っています。

[Ruby] 巨大ファイルを行数を指定して分割する

9GBもある巨大なファイルの中身をみる機会があり、エディタで開けるサイズではないのでスクリプトを書いたのでメモ。

# coding: UTF-8
def splitText src_txt_name, lines_limit
  source_file, lines_limit = ARGV
  basename  = File.basename(source_file, '.*')
  extension = File.extname(source_file)
  
  open source_file do |f|
    size = File.size f.path
    num_line = 0
    num_file = 1
    output_file_name = "#{basename}_#{num_file.to_s}#{extension}"
    f.each_line do |line|
      output(line, output_file_name)
      
      num_line += 1
      if num_line >= lines_limit.to_i
        num_file += 1
        num_line = 0
        output_file_name = "#{basename}_#{num_file.to_s}#{extension}"
      end
      $stderr.print sprintf("%.3f%",f.tell.to_f/size.to_f*100)+"\r"
    end
  end
end

def output text, dst_txt_name
  File.open(dst_txt_name, "a") do |wf|
    wf.puts text
  end
end
  
# main start
unless ARGV.length == 2
    p 'usage: splittext.rb src_txt_name lines_limit'
    exit
end
splitText(ARGV[0], ARGV[1])

全部分割しようとするとかなり時間がかかる...
ファイルの構造を知りたかったから途中でやめた。
もう少しいい方法ないかな。