• ベストアンサー

外部ファイルから読み込んだデータを配列変換したい!

Japanese 72 99 40 Math 88 48 32 English 13 77 96 というデータファイル(test.dat)があります。数字は省略しましたが各200ずつ計600で、データ数はJapanese・Math・Englishの行含め全部で603です。上から順に出席番号1番2番・・・となりますので200人分の成績データということになります。 これら数値データを用いて各教科ごとの平均点を出したり、成績順に並べ替えたりしたいのです。 そのためにこのデータファイルの数値の部分だけ配列にしたいのですが、外部のファイル、しかも数値と文字が混じったデータを配列に変換するにはどうすればよいでしょうか。 [00],[01],[02]・・・・・・・・(以下200人分) [10],[11],[12]・・・・・・・・ [20],[21],[22]・・・・・・・・ というのをイメージしているのですが(列は出席番号・行は各教科)、他に良いアイデアはありますでしょうか。 申し訳ありませんが、ご教授願います。

質問者が選んだベストアンサー

  • ベストアンサー
  • tachiwa
  • ベストアンサー率34% (25/73)
回答No.6

ANo#3さんの言われるようにexcelが簡単でしょうがjavaでやりたいなら、以下のコード参考にしてください。合計と平均はプログラムの中で計算しています。 なおtest.datの最終行に END という文字列を追加してください。 import java.io.*; public class LineCalc { public static void main(String args[]){ String[] item= {new String("Japanese"), new String("Math"), new String("English"), new String("END")}; int[][] intArray=new int[3][200]; try{ BufferedReader br=new BufferedReader(new FileReader("test.dat")); String line=null; for(int i=0;i<item.length-1;i++){ int sum=0; int point=0; int counter=0; if(i==0) line=br.readLine(); if(line.equals(item[i])){ while(!(line=br.readLine()).equals(item[i+1] )){ point=Integer.parseInt(line); intArray[i][counter]=point; sum=sum+point; counter++; } System.out.println(item[i]+":合計:"+sum); System.out.println(item[i]+":平均:"+sum/counter); } } for(int k=0;k<3;k++){ for(int j=0;j<200;j++){ System.out.print(intArray[k][j]+" "); } } br.close(); }catch(Exception ex){ ex.printStackTrace(); } // } }

lutea
質問者

お礼

ご回答ありがとうございます! ソースを参考にして、無事希望するものを作成することができました!! 本当に助かりました。こころよりお礼申し上げます。

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

その他の回答 (6)

  • osumitan
  • ベストアンサー率33% (102/307)
回答No.7

No.3の補足です。 java.util.ArrayListは、可変長配列を扱えるクラスです。 普通の配列のように、宣言時に要素数を決めるのではなく 処理しながら要素を追加していくような使い方をします。 使い方の詳細はAPIドキュメントを参照いただくとして 簡単に書くと、こんな使い方ができます。 addで追加、getで取得、iteratorで反復子を取り出します。 ----------------- import java.util.ArrayList; import java.util.Iterator; public class Test {   public static void main(String args[]) {     // コマンドライン引数をArrayListに移し替え     ArrayList list = new ArrayList();     for(int i = 0 ; i < args.length ; i++) {       list.add(args[i]);     }     // ArrayListの要素数を表示     System.out.println("要素数=" + list.size());     // ArrayListの内容を順次表示(get)     System.out.println("getで内容表示");     for(int i = 0 ; i < list.size() ; i++) {       System.out.println((String)list.get(i));     }     // ArrayListの内容を順次表示(Iterator)     System.out.println("Iteratorで内容表示");     Iterator it = list.iterator();     while(it.hasNext() == true) {       System.out.println((String)it.next());     }   } } ----------------- $ java Test あいう abc 123 要素数=3 getで内容表示 あいう abc 123 Iteratorで内容表示 あいう abc 123 ----------------- データも今の形式より、もし変えられるようであれば 以下のような形式の方が扱いやすいでしょう(CSVです)。 ----------------- No,Japanese,Math,English 1,72,88,13 2,99,48,77 3,40,32,96 : : -----------------

lutea
質問者

お礼

ArrayListをわかりやすくご教授くださりどうもありがとうございました! たいへん勉強になりました。参考にして頑張ってみます!

全文を見る
すると、全ての回答が全文表示されます。
  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.5

>文字列を数値に変換したいのですが、方法がわかりません。 JavaDocでjava.lang.Integerクラスを調べましょう。

参考URL:
http://java.sun.com/j2se/1.4/ja/docs/ja/api/index.html
lutea
質問者

お礼

ご回答ありがとうございます。 いろいろと勉強不足ですみません…

全文を見る
すると、全ての回答が全文表示されます。
  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.4

どのあたりでつまずいているのでしょう? a外部ファイルにアクセスする方法は出来ている? b外部ファイルから1行ずつ読むのはできている? c読んだ1行のデータを、文字列型変数に代入することはできている? d読んだデータは文字列型なのでそれを数値型(intやdouble)に変換する関数は知っている? e2次元配列の宣言の仕方、書式は知っている?   配列の添え字が0から始まることは知っている? fデータの並び方や個数は常に同じか?   No2の方の発言にある通りだとして以下のように配列を用意してみます。  →教科項目用に文字列型配列 配列の個数3  →数値データに2次元配列  3×200 g読み込み行カウント変数を用意して、0行目から開始 h. whileで1行ずつ読み込む、終了条件はファイルエンド i 行数を201で割った余りが0なら項目用文字列型配列に代入、配列番号は201で割った商 j 行数を201で割った余りが0ではないときは、数値型配列に代入    [項目番号:201で割った商][出席番号-1:201で割った余り-1] k 行カウント変数をインクリメントして次の行 No3の方のように、ArrayListをつくる方がよりオブジェクト指向な作りだとは思います。

lutea
質問者

お礼

ご回答ありがとうございます。 なんとか外部ファイルを読み込んで、IFで条件分けをして教科項目を除いて、成績データを多次元配列にするところまでいきました。 このような感じです。 国語   数学   英語 [1][1]  [2][1]  [3][1]  :    :    : [1][200] [2][200] [3][200] しかし、各教科の平均を出したりするため、文字列を数値に変換したいのですが、方法がわかりません。 出来たところまでのソースをはります。 import java.io.*; public class java05 { public static void main(String args[]) throws IOException{ String ss; int i=0, j=0, k=0, m=0, n=0, x=0; int data[] =new int[200]; String a[][] =new String[4][201]; BufferedReader fin = new BufferedReader( new FileReader("score.dat")); for(i=1; i<=3; i++){ for(j=0; j<=200; j++){ ss=fin.readLine(); if(j!=0){ a[i][j]=ss; System.out.println("("+i+","+j+")="+a[i][j]); } } } fin.close(); } } データ構造はNo2の方のおっしゃるとおりです。 一応、score.dat(test.dat)を置いておきます。 http://jp.y42.briefcase.yahoo.co.jp/bc/hsawqipg/lst?.dir=/%a5%de%a5%a4%a5%c9%a5%ad%a5%e5%a5%e1%a5%f3%a5%c8&.view=l&.src=bc&.done=http%3a//jp.y42.briefcase.yahoo.co.jp/bc/hsawqipg/lst%3f.dir=/%25a5%25de%25a5%25a4%25a5%25c9%25a5%25ad%25a5%25e5%25a5%25e1%25a5%25f3%25a5%25c8%26.src=bc%26.view=l 重ねてアドバイスいただけたら幸いです。

全文を見る
すると、全ての回答が全文表示されます。
  • osumitan
  • ベストアンサー率33% (102/307)
回答No.3

Excelとかに貼り付けた方が簡単な気がしますが… 私なら…   int japanese   int math   int english をプロパティに持つクラスを作って、 それをArrayListに持つクラスを作って、 親のクラスにソートや集計のメソッドを持ちます。

lutea
質問者

お礼

ご回答、ありがとうございます! しかしせっかくお教えくださったのですが、ArrayListがわかりません…。 なにぶん応用が利かないもので、もしよろしければ質問のArrayList使用例をご記述くださると助かります…。なるべくオブジェクト指向が好ましいので…。

全文を見る
すると、全ての回答が全文表示されます。
  • hidebu-
  • ベストアンサー率53% (45/84)
回答No.2

外部リソースとなる、外部ファイルのデーター構造がいまいちわかりにくいのですが、、、 --------------------------------------------- Japanese 72 99 40 (以下200人分つづく) Math 88 48 32 (以下200人分つづく) English 13 77 96 (以下200人分つづく) --------------------------------------------- といった形でしょうか?

lutea
質問者

お礼

わかりづらくて申し訳ないです。 データ構造はそのとおりです。 念のためこちらにscore.datを置いておきます。(質問にはtest.datとありますが、中身は同じです) http://jp.y42.briefcase.yahoo.co.jp/bc/hsawqipg/lst?.dir=/%a5%de%a5%a4%a5%c9%a5%ad%a5%e5%a5%e1%a5%f3%a5%c8&.view=l&.src=bc&.done=http%3a//jp.y42.briefcase.yahoo.co.jp/bc/hsawqipg/lst%3f.dir=/%25a5%25de%25a5%25a4%25a5%25c9%25a5%25ad%25a5%25e5%25a5%25e1%25a5%25f3%25a5%25c8%26.src=bc%26.view=l もしよろしければアドバイスをいただけると嬉しいです。 よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。
  • kakusuke
  • ベストアンサー率36% (95/259)
回答No.1

俺だったら int japanesepoint[]; int mathpoint[]; int englishpoint[]; ってのに値をぶち込む。

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

関連するQ&A

  • 読み込んだデータを配列へ代入する方法

    ---ここから--- 1,2 3,4 ---ここまで--- このようなファイルを読み込んでデータを配列へ格納するには, $pathname="D://data.txt"; open MYFILE, "$pathname"; @list=<MYFILE>; for($i=0;$i<2;$i++){ @dat=split(/,/,$list[$i]); print @dat; } close MYFILE; といったようなforあるいはwhileで1つの配列(上の場合だと@dat)に1行のデータを繰り返し入れていく方法しか思い浮かびません。できれば1行目のデータは@dat1という配列へ,2行目のデータは@dat2という配列へ,といったように行ごとに別々の配列へ代入させたいのですが良い方法はないでしょうか。 もしくは@dat=([1,2],[3,4])のような2次配列の形にでもできれば最高なのですが、、、

    • ベストアンサー
    • Perl
  • 固定長ファイルを配列に!

    5行まで違うデータが入っていて 6行目から 347.44 14832 616 4.15 といったようなデータになっています。 この数値だけを配列に入れようと思うんですが どうすればよいでしょうか? ちなみに・・・ 1行ずつ文字列として配列に入れて 6行目に当たる配列から substrを使ってそれぞれ分けようと思ったのですが 小数点がない真ん中の二つのデータが うまくとれないんです。 わかる方よろしくお願いします。

    • ベストアンサー
    • PHP
  • 連想配列(ハッシュ)のファイルへの書き込み方

    連想配列(ハッシュ)のファイルへの書き込み方と、 そのファイルからの読み込み方で困っています。 たとえば以下のような連想配列(ハッシュ)があって %colorFile = ( 'red'=>'5', 'green'=>'10', 'blue'=>'3' ); この情報をサーバーの color.dat ファイルに書き込んで保存し、 変更があったときにファイルからデータを読み込むには どのようにしたらいいのでしょうか? 連想配列(ハッシュ)のまま保存すると color.datの中身が green10blue3red5 のようになってしまい、 読み込んだときに連想配列(ハッシュ)に復元できません…。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • ファイルからデータを読み込んで、配列に格納する方法

    データファイル grep.dat があり、その中は 12345 67890 ABCDE (EOF) となっています。   このファイルの中身を読み込んで、配列 P[0]の 中に("12345","67890","ABCDE") に格納したい のですが、どのように記述すればよいでしょうか。

    • ベストアンサー
    • Perl
  • 配列の並び替え

    下のように5つの配列がA~E列まであって、2、3行目にデータが入っています。このときに、2行目の値が3行目の値より小さい配列で、かつ、2行目の値が小さい順に並べる。その後に、3行目より、2行目の値の方が大きい配列を3行目の値が大きい順に並べるマクロコードを教えてください。   A B C D E←列      1  1 2 3 4 5←配列番号 2  4 9 8 6 2 3  1 5 7 10 3      ↑ 行    ↓     A B C D E 1  5 4 3 2 1 2  2 6 8 9 4 3  3 10 7 5 1

  • ファイルの中の配列データの変更

    以下の内容のファイル A.datがあります。 "34"-"情報処理" "87"-"会計" "99"-"社会学" [EOF] いま、"87"と"医学"という値がPerlの引数で与えられたとして "87"-"会計" → "87"-"医学" というふうに置き換えたいのです。 "87"と一致する行を配列に読み込むことはできました。 "87"-"会計"の"会計"も読み出せます。"87"-"医学"にも置換でき ます。しかし、それを元のファイルA.datにそこの部分だけを 変更して書き戻すことができません。 どのようにしたらよいのでしょうか。

  • 配列を変更しファイルに書き込むとなぜか古い配列も・・・

    WEB上のCGIで、 ファイル(file.dat)から配列@lineを読み込み、 @line=(01,02,03) となっているときに、配列を操作して @newline=(01,03) とし、この @newline を open(OUT,">file.dat"); print OUT @newline; close(OUT); と処理したところ、なぜか、その中身は 01 03 01 02 03 となってしまいます。つまり、新しいデータ以外に古いデータも書き込まれるのです。 いろいろ試しました。書き込みの前後で@newlineの中身を画面に表示するなどして 確かめましたが、そこには異常はありません。 また、いろいろ変えていくと、場合によっては、ファイルの中身は 01 03 00001 01 02 03 などという訳の分からないことになってしまいます。 追加書き込みの可能性はありません。 試しに @newline の中身を空にして書き込みしてみると、 この場合は ファイルの中身も空になっています。 つまり、 @newlineの中身が有るときは、 画面上には正しく表示されるのに、ファイルに書き込まれるときには、 古いデータ(場合によっては変なデータも)も一緒に出力されていると言うことです。 こういう現象の原因として何が考えられますでしょうか? 今まで、数々のファイル操作をしてきましたが、こういったことは 初めてです。 どうかご教授下さい。

  • ファイルから文字列を読み込んで、検索するプログラム

    以下のようなプログラムをつくりたいのですが、 どうしたらよいでしょうか?? 文字列を配列型に入れるときにわからなくなって しまうのですが。。。 ファイルからデータを順番に読み込み,メモリ上に一次元配列構造に並べて線形探索するプログラムを作成せよ. データの仕様 一行に、 「番号(スペース)読み仮名(スペース)文字列(住所)」 があり、これが10~1000行ほど、ファイルに(.dat) 入っている。 ファイルを配列に読み込んだあと、 番号を入力すると、住所が検索されてでてくる。 問題文も微妙なのですが、 これは番号の配列と住所の配列は別にして、 検索したほうがいいですよね、、? 何かヒントになることだけでも良いので、 よろしくお願いします!

  • 1次元配列「成績」の中に、学生5人分の得点が格納さ

    1次元配列「成績」の中に、学生5人分の得点が格納されている。 配列内のデータを得点の高い順に並び替える流れ図を作成しなさい。 配列:成績 配列:成績 69 56 97 66 71 →97 71 69 66 56 これの求め方を教えて下さい。

  • 表示中の表をデータファイルに格納する

    5列×10行の表を表示させました。 その表の1行をレコードとして、5列×10行(つまり10 レコード分)のデータを @hyouji という配列に格納したい のですが、どのような方法があるでしょうか。 @hyouji の配列内では、要素の長さによるずれはあるものの 表通りの順になります。

男性の考える恋愛とは?
このQ&Aのポイント
  • 男性の恋愛観や考え方について知りたい
  • セフレと彼女の違いや接し方について教えてほしい
  • 男性の方々の意見を聞きたい
回答を見る