電子書籍の厳選無料作品が豊富!

初めて質問いたしますので不備があるかもしれませんがよろしくお願いいたします。では、早速ですが、
Javaで以下のようなカンマ区切りのデータの
テキストファイルを読み込み
------------------------------------
1,0,0,20080101101000,A,Z,11
2,0,0,20080101101000,A,Z,12
3,0,0,20080101102000,B,Z,13
4,0,0,20080101105000,C,Z,17
7,0,0,20080101103000,B,Z,14
8,0,0,20080101104000,Z,Z,14
9,0,0,20080101106000,X,Z,16
------------------------------------
4番目、5番目の値で抽出した
下記のような集計結果を得たいです。
20080101101000,A が2件
20080101102000,B が1件
20080101103000,B が1件
・・・
データが数百万件となるので効率よく、メモリを圧迫しないように
処理したいのですが、良い方法がありますでしょうか?
Javaは、ほとんど初心者といって良いほどの知識ですので
なにとぞよろしくお願いいたします。

A 回答 (1件)

データの集計が主目的だったら、Javaでなく、PerlやRubyなどの手軽なスクリプト系にしては。


たとえば、perlで書くとこんな感じ:

<a.txt perl -MData::Dumper -F, -ane "$a{$F[3].','.$F[5]}++;END{ print Dumper(\%a)}"

結果は以下:
$VAR1 = {
'200801010000,N' => '160840',
'200801010000,O' => '161383',
'200801010000,P' => '161520',
以下略。
400万件のテキストを読みこませたら、1分くらいで処理します(動作クロック2GHzくらいのパソコン、OSはVistaでの結果)。
メモリ使用量も100MB程度なので、1GBくらいメモリを載せていれば十分処理できます。

UNIX系OSを使っているか、あるいはWindowsにcygwinやSubsystem for UNIX Applicationなどをセットアップしているなら以下のコマンドでもOK:

<a.txt cut -d , -f 4,6 | sort | uniq -c

これだと3分くらい(VistaのSUAで実行)。
MS Accessなどのデータベースに登録してから、クエリで集計するという手もあります。

主目的がJavaプログラミングというのだったら、
・ファイル入出力
・文字列演算
・コレクション操作(Hashtableなど)
――あたりを学べばよいかと。

この回答への補足

osamuyさん、回答ありがとうございます。

用件がJavaでということなのでJavaで実装を考えております。
ちなみに動作環境のOSはSolarisとなります。
ArrayListやHashMapを使用し、算出すると思うのですが、
データ量が多いため、ArrayListにデータが入らず、
ヒープサイズエラーとなったので、
読み込みながら判断して、集計分だけ抽出(ArrayList保管)みたいな・・・
都合の良いことが出来ないものかと思案しておりました。
順番どおりデータが並んでいないのがまたやっかいなんです・・・。

補足日時:2008/07/12 15:17
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

お礼日時:2008/07/12 15:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!