• 締切済み

Javaでファイル読み込みをして、集計したいです。

初めて質問いたしますので不備があるかもしれませんがよろしくお願いいたします。では、早速ですが、 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は、ほとんど初心者といって良いほどの知識ですので なにとぞよろしくお願いいたします。

みんなの回答

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.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など) ――あたりを学べばよいかと。

kazxxx
質問者

お礼

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

kazxxx
質問者

補足

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

すると、全ての回答が全文表示されます。

関連するQ&A