• ベストアンサー

読み込んだファイルを1行ずつ保管する

java eclipse3.5を使ってプログラミングを勉強しています. FileReader file_probelist = new FileReader("probe_list.txt"); BufferedReader reader_probe = new BufferedReader(file_probelist); でファイルを読み込みます.probe_list.txtには次のようなことが書いてあります. probeA,192.168.71.103,10 probeB,192.168.71.104,11 probeC,192.168.71.105,12 これらをつぎのようにして読み込みます. while ((line_probelist = reader_probe.readLine()) != null) {  String[] probe_v = line_probelist.split(",");  reader_probe.close(); } 上のコードを実行すると, 1行目 line_probelist = probeA,192.168.71.103,10 probe_v[0] = probeA probe_v[1] = 192.168.71.103 probe_v[2] = 10 2行目 line_probelist = probeB,192.168.71.104,11 probe_v[0] = probeB probe_v[1] = 192.168.71.104 probe_v[2] = 11 3行目 line_probelist = probeC,192.168.71.105,12 probe_v[0] = probeC probe_v[1] = 192.168.71.105 probe_v[2] = 12 となります.これらを2次元配列にしたいのですが,どうすればよいのでしょうか? hensuu[行の数][3]という感じになると思いますが,うまくいきません. 最初からprobe_list.txtの行数が分かっていればそれを入力すればよいですが, 行数が分かっていないため,なにを入力すればよいか分かりません. アドバイスを頂きたいです.よろしくお願いします.

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

  • ベストアンサー
回答No.1

import java.io.*; import java.nio.charset.*; import java.util.*; /* このソースは半分以上が、無駄なコメントで占められている。適宜削除すること。 何?インデントが見づらいだと? HTMLのソースからこのコードの部分をテキストエディタにコピーしてから読むなり、 ユーザースタイルシート(CSS)でwhite-spaceプロパティにpre-wrapを与えるなり好きにしろ。 */ class Q5624477{ public static void main(String[] args){ try{ String[][] data = null; data = Q5624477.getData(); System.out.println(data.length); for (int i = 0;i < data.length;i++){ System.out.print(data[i][0]); for (int j = 1;j < data[i].length;j++){ System.out.print(","); System.out.print(data[i][j]); } System.out.println("\n"); } }catch(FileNotFoundException e){ System.out.println(e.getStackTrace().toString()); }catch(IOException e){ System.out.println(e.getStackTrace().toString()); } } public static String[][] getData() throws FileNotFoundException,IOException{ /* 戻り値のための変数 */ String[][] retval = new String[0][0]; /* FileReaderからFileInputStream経由に変更したのはこちらの都合。俺は暗黙的なのが嫌いで、 文字符号化方式を意識していますよ、このコードを引き継ぐ人も意識してください みたいな喚起の意味で書いている。 ファイル名は勝手に変えた。中身は符号化方式以外は同じだ。改行コードは知らんが。 */ FileInputStream file_probelist = new FileInputStream("Q5624477-1.txt"); BufferedReader reader_probe = new BufferedReader(new InputStreamReader(file_probelist,Charset.forName("UTF-8"))); /* 正直な事言えば、配列自体が好きでない。 */ /* String[3]のように長さを指定していくことは出来ないようだ。 ArrayList<ArrayList<String>>でも、後で対処出来るならよし。 C#と違い、List.ConvertAll(delegate)みたいなものがないので ちょっとやりづらい。 わざわざ、 org.apache.commons.collections.CollectionUtilsとか他のライブラリ借りてくるか ループの構文をとらないといけないからね。今回はこれらを借りてこない。 いずれにしてもジャグ配列が好きなわけではないので http://ja.wikipedia.org/wiki/%E9%85%8D%E5%88%97#.E3.82.B8.E3.83.A3.E3.82.B0.E9.85.8D.E5.88.97 どうしても配列でないといけない理由がないのなら、 3つのprivateメンバ変数と、それらへのアクセサのあるクラスを自作し、 それをGenericsの型パラメータに置いちゃった方が間違いが少ないだろう。 ArrayList<Data> list = ArrayList<Data>(); //snip list.Data.InetAddress.ToString() */ /* ArrayList使いたくないってのなら 別に空読みして、もう一回読んでもいいけど、イヤでしょ? String[][] retval = null; int i = 0; while(true){ String line_probelist = reader_probe.readLine(); if(line_probelist == null){ break; } i = i + 1; } retval = new String[i][3]; i = 0; while(true){ String line_probelist = reader_probe.readLine(); if(line_probelist == null){ break; } retval[i] = line_probelist.split(","); i = i + 1; } */ ArrayList<String[]> datalist = new ArrayList<String[]>(); while(true){ /* 変数のスコープは小さくしておきたいが、外部におかない状態で while((String line_probelist = reader_probe.readLine()) != null){ } とかやったらコンパイル出たからこんな記述 */ String line_probelist = reader_probe.readLine(); if(line_probelist == null){ break; } datalist.add(line_probelist.split(",")); /* 戻り値として受け取りたい人や、この配列のメソッドを呼び出したいときは戻り値を受け取っても構わないでしょう */ } return datalist.toArray(retval); } }

debukawa
質問者

お礼

himajin100000様,回答ありがとうございます. 載せていただいたソースコードの動作確認とれました. >ArrayList使いたくないってのなら >別に空読みして、もう一回読んでもいいけど、イヤでしょ? とありましたが,これはファイルを2回読み込んで,1回目は何行あるのかの確認, 2回目が実際にデータを読み取っていく, ということでしょうか?

その他の回答 (1)

回答No.2

そんなにこねくり回さなくても素直に考えればよいです。 try { FileReader file_probelist = new FileReader("probe_list.txt"); BufferedReader reader_probe = new BufferedReader(file_probelist); List<String[]> lineList = new ArrayList<String[]>(); String line = null; while ((line = reader_probe.readLine()) != null) { lineList.add(line.split(",")); } String[][] array = new String[lineList.size()][]; array = lineList.toArray(array); reader_probe.close(); file_probelist.close(); for (String[] row : array) { for (String col : row) { System.out.println(col); } } } catch (Exception e) { e.printStackTrace(); }

debukawa
質問者

お礼

mononoke99様,回答ありがとうございます. 載せていただいたソースコードの動作確認をしました. ですが,コードの意味が分かりません. List<String[]> lineList = new ArrayList<String[]>(); array = lineList.toArray(array); for (String[] row : array) {  for (String col : row) {   System.out.println(col);  } } 上の2行はリファレンスをよく読めば分かるかもしれませんが, for文はさっぱり分かりません. どういう意味でしょうか? 申し訳ありませんが,教えていただけないでしょうか?

関連するQ&A