[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])
全部分割しようとするとかなり時間がかかる...
ファイルの構造を知りたかったから途中でやめた。
もう少しいい方法ないかな。