CSVデータファイルを行単位で処理するためのクラス。以下のような特徴を持つ。
C++で実装されており非常に高速に動作する(wc -lより若干高速)。
一行目の項目名行を除いたデータの行数のみカウントする。
単純に改行charをカウントしているだけなので、ダブルクォーテーションでエスケープされた改行もカウントしてしまう。 この問題を避けたい場合はMCMD::Mtableを利用する。
MCMD::mrecount(arguments)
argumentsに、以下の引数をスペースで区切った文字列として指定する。
i= |
入力ファイル名(String) |
-nfn |
1行目を項目名と見なさない。 |
# dat1.csv 顧客,日付,金額 A,20081201,10 B,20081002,40 p MCMD::mrecount("i=dat1.csv") # -> 2 p MCMD::mrecount("i=dat1.csv -nfn") # -> 3
Mtable : CSVデータのセル単位での読み込み操作
CSVデータの行数カウント処理について、UNIXコマンドwcとMtableをベンチマークにした速度比較を行う。 Table 3.1にベンチマークテストの結果を示す。 100万,200万,300万,400万行,500万行のデータについて実験を行った。 Figure 3.1には、ベンチマークテストで利用したスクリプトの抜粋が示されている。 mrecountはwcに比べて若干高速である。 またMtableは行数をカウントすることのみを目的としたクラスではないが、 比較すると、5〜6倍高速である。
行数 |
1000K |
2000K |
3000K |
4000K |
5000K |
mrecount |
0.034 |
0.066 |
0.097 |
0.129 |
0.161 |
wc -l |
0.038 |
0.070 |
0.103 |
0.133 |
0.169 |
Mtable |
0.231 |
0.407 |
0.503 |
0.731 |
0.828 |
require 'rubygems' require 'mtools' require 'benchmark' puts Benchmark.measure{ (0...10).each{|i| # mrecountの場合 p MCMD::mrecount("i=data.csv") # wcの場合 system "wc -l data.csv" # Mtableの場合 MCMD::Mtable("i=data.csv -array"){|tbl| p tbl.recordSize } } }