1

7月 19

 

csvファイルの数行に一行を抜き出すrubyスクリプト

巨大なデータファイルの数行に一行がほしいということがあります。

たとえば、1分おきに記録されている元データがあるけど、実際には1時間に一回のデータが見られればいいという場合、60行につき1行のデータがとれれば事足りるという具合です。


result = ""

idx = 0
File.open('./src.csv', 'r') do |f|
    f.each_slice(10000) do |chunk|
        result += chunk[0].to_s
        puts idx	#check progress
        idx += 1
    end
end

File.open("./output.csv", 'w') do |f|
    f.puts result
end

肝は io.each_slice(n)メソッドを使うことです。

もともとのsrc.csvは1億2千万行を保持するファイルですが、each_slice(10000)を使うことによって、1万件のデータをひとかたまり(chunk)として取り出し、その1行目をresultに追記していくことで1万行につき一行を取り出すということをやっています。

この方法だと、メモリの使用量も全行を読み出すのに比べてずいぶん節約できているようでした。

スクリプトを回して10秒ちょっとくらいで無事、1万2千件のデータがoutput.csvに保存されました。




No comments yet, be the first.

コメントを残す