result = [] ARGF.each do |line| lineno = ARGF.file.lineno - 1 result[lineno] ||= [] line.chomp.split(',').collect{|i|i.to_i}.each_with_index do |val, i| begin result[lineno][i] += val rescue NoMethodError result[lineno] << 0 retry end end end
csv ファイルを 10 個作ってベンチ取ってみた。 メモリ消費は8MBくらいかな。AthlonXP1700+ Win2KSP3 $ruby -v ruby 1.7.3 (2002-09-05) [i386-cygwin] $time test.sh real 1m42.939s user 1m41.591s sys 0m0.296s
----- gen.c #define M 2000 #define N 400 int main(void){ int i, j; srand(time()); for (i=0; i<M; i++){ for (j=0; j<N; j++){ printf("%d", rand() % 100 ); if (j < N - 1) printf(","); else printf("\n"); } } return 0; }
----- hoge.rb result = [] ARGF.each do |line| lineno = ARGF.file.lineno - 1 result[lineno] ||= [] line.chomp.split(',').collect{|i|i.to_i}.each_with_index do |val, i| begin result[lineno][i] += val rescue NoMethodError result[lineno][i] = val end end end result.each{|i|puts i.join(',')}