[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])

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