Kengo's blog

Technical articles about original projects, JVM, Static Analysis and TypeScript.

DOSバッチとRで拡張子ごとにファイルサイズを集計する

Rのキャッチアップ第2弾。指定したディレクトリ以下に保存されているすべてのファイルに対してファイルサイズを調べ、拡張子ごとに合計を取得してグラフ化します。私の環境では以下のような結果となりました。以前ダウンロードしたXenServerのISOとEclipseプラグインを構成するJARが大部分を占めているようです。
f:id:eller:20090809145252p:image

DOSバッチによる元データ作成

元データ(拡張子とファイルサイズ)の作成には手軽に利用できるDOSバッチを採用しました。I/Oが高くつくため時間をかなり必要としますが、1度実行するだけで充分ですので気長に待つことにします。

@ECHO OFF
REM ファイルサイズ取得バッチ
REM カレントフォルダ以下にあるすべてのファイルに対し、拡張子とファイルサイズをタブ区切りで出力する

SET __LOGFILE_NAME=filesize.txt
DEL %__LOGFILE_NAME%

FOR /r %%F IN (*.*) DO (
  ECHO %%~xF	%%~zF >> %__LOGFILE_NAME%
)

作成されるファイルは以下のようなフォーマットとなります。区切り文字にタブを使用したのは、スペースやカンマはファイル名として使用できてしまう=拡張子に含まれる可能性があるためです。

.JPG	1724555
.JPG	1810203
.JPG	1723646
.mid	57241
.lnk	654
.lnk	908
.lnk	766
.lnk	593
.xml	1233
.txt	1043

Rによる円グラフの作成

最適な関数オブジェクトの検索に手間取りましたが、結果は以下の通りです。拡張子の大文字小文字は区別しています。

fs<-data.frame(scan("filesize.txt", sep="\t", list(e=" ", s=0)))
grouped<-rowsum(fs[,2],fs[,1])
names(grouped)<-rownames(grouped)
pie(grouped, radius=1)

SQLのORDER BYに似た処理をどのように実装すべきか迷いましたが、今回はrowsum関数オブジェクトで実現することができました。複雑な処理の場合はapplyに自作関数オブジェクトを渡すような工夫が必要になるのかもしれません。
3行めのnames<-rownamesが妙な感じですが、私のデータの扱いに問題があるから必要になってしまうのでしょうか。

参考(過去ログ)

[http
//rpen.blogspot.com/2007/11/excel.html:title]:HSP3とExcelで似た処理を行うサンプルです。