• ベストアンサー

読み込んだファイルを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の行数が分かっていればそれを入力すればよいですが, 行数が分かっていないため,なにを入力すればよいか分かりません. アドバイスを頂きたいです.よろしくお願いします.

  • Java
  • 回答数2
  • ありがとう数3

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

  • ベストアンサー
回答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

  • javaで大量のファイルを読み込む方法

    javaプログラミングについて質問です。 例えば、a1.txt~a100.txtの100個のテキストファイルがある として、これをループか何かを使って順番に読み込みたいのですが、 そのような方法はあるのでしょうか。 // ファイル入力ストリームを取得 BufferedReader br = new BufferedReader(new FileReader("a1.txt")); BufferedReader br2 = new BufferedReader(new FileReader("a2.txt")); BufferedReader br3 = new BufferedReader(new FileReader("a3.txt")); ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ BufferedReader br100 = new BufferedReader(new FileReader("a100.txt")); という風に書くのが面倒に思っています。 宜しくお願いします。

    • ベストアンサー
    • Java
  • ファイル出力時の

    以下のソースでファイル出力するのですが、 BufferedReader br = new BufferedReader(new FileReader(new File(args[0]))); PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(args[1]))); //一行読み込みを行った文字列を格納 String line; //一行読み込み while((line = br.readLine()) != null){ //一行書き込み pw.write(line); System.out.println(line); } コンソールへの出力は正常に出力されるのですが、 ファイルへの出力は改行されずに一行で出力されてしまいます。 どうすればファイル出力も正常になるか教えてください。

  • CSVファイルから特定の文字列を含む行を出力

    CSVファイルを読み込み、特定の文字列を含む行を出力するプログラムを作成しています。 出力メソッドを作り、呼び出したいのですがうまくいきません。 コンパイルは通りますが出力したファイルには何も書き込まれていない状況です。 ヒントだけでも頂けると幸いです。 よろしくお願いします。 import java.io.*; import java.util.*; public class Test{ static String[] data; static BufferedWriter writer = null; public static void main(String[] args) throws Exception { String line; BufferedReader reader = null; reader = new BufferedReader(new FileReader("Week.csv")); writer = new BufferedWriter(new FileWriter("New.csv")); while (reader.ready()) { line = reader.readLine(); if (line.contains("氏名")) { create(line); } else if (line.contains("月")) { create(line); } else if (line.contains("水")) { create(line); } else if (line.contains("金")) { create(line); } } } //メソッド static void create(String line) throws Exception { data = line.split(","); for (int i = 0; i < data.length; i++) { writer.print(data[i]); writer.println(); } } }

    • ベストアンサー
    • Java
  • CSVファイルの特定の行だけを読み込みたいです。

    例えば以下のようなCSV形式のデータが10000行あるとします。  1,10,15,3  2,1,5,1  70,2,4,2  2,4,5,6  11,1,9,9  ・・・ 上記ファイルから、例えば9999行目を取得したい場合、 現在は以下のような手順で9998行をループで読み込んでから、 9999行目を取得しています。(エラー処理などは省いています)  BufferedReader br = new BufferedReader(new FileReader("hoge.csv"));  for( int i=0; i<9998; i++ ){ br.readLine(); }  System.out.println("9999行目="+br.readLine()); ただし、上記の通りループを9998回まわし、 データを1行ずつ読み込むのは非常に効率が悪いです。 できれば、br.readLine(9999); といった感じで行数を直接指定できる方法があるならば、 無駄な処理を省けて見栄えも速度も良くなると思うのですが、 Javaの標準のクラスではこういったことは可能なのでしょうか? 私なりに調べてみたのですが調べ方が悪いのか知識が及ばないため、 こちらで質問させていただきました。 もしご存知の方がおられましたらアドバイスいただけますと助かります。 よろしくお願いします。

    • ベストアンサー
    • Java
  • textファイルについて

    あるディレクトリーに test.txt aaa.txt があるのですが、 二つのテキストを開いて もし text.txtの3行目に http://www.goo.ne.jp/ があり aaa.txtの10行目にも http://www.goo.ne.jp/ があるとすれば aaa.txtの10行目を消したいのですが、 そんな事って可能ですか?? 色々考えたのですが、aaa.txtの10行目を消す時に 10行目を空にすると言う指定が出来なくて困ってます。 どうしてもaaa.txtの削除が出来ません。 参考までにスクリプトを載せておきます <?php $file_name = array("aaa.txt", "test.txt"); $list = fopen($file_name[0], "a+"); $delete_list = fopen($file_name[1], "r"); $listfile = file($file_name[0]); $listmax = count($listfile); $listfile = file($file_name[1]); $delete_listmax = count($listfile); if ($delete_listmax > 0){ for ($delete_line = 1; !feof($delete_list); $delete_line++){ $delete_lines = fgets($delete_list); $delete_lines = trim($delete_lines); if ($delete_lines){ if (is_file($file_name[0])){ for ($line = 1; !feof($list); $line++){ $lines = fgets($list); $lines = trim($lines); if ($lines){ if ($delete_lines == $lines){ //ここの部分がわからないです fputs($list, "あああ"); echo "O,K\n"; } } } } } } } fclose($delete_list); fclose($list); echo "\n終了\n"; ?> 詳しい方がいましたら宜しくお願いします

    • ベストアンサー
    • PHP
  • CSVファイルの、列だけ取得したい

    FileReader filereader = new FileReader(FileName); BufferedReader bufferedreader = new BufferedReader(filereader); String line; int i = 0; while((line = bufferedreader.readLine()) != null) { int j = 0; StringTokenizer stringTokenizerTest = new StringTokenizer(line, ","); while(stringTokenizerTest.hasMoreTokens()) { item[j][i]=stringTokenizerTest.nextToken().toString(); j++; } i++; } filereader.close(); このような記述で、CSVの中身を全て取得することは出来るのですが、 ある一列だけ取得する方法がわかりません。 具体的には、コンボボックスにCSVのある一列だけ表示させたいです。 (その後、重複なしの値のみにフィルタリングしたい) 現在は苦し紛れに、 combo1.setModel(new DefaultComboBoxModel(new String[] { item[1][3], item[1][4], item[1][5], item[1][6], item[1][7], item[1][8], item[1][9], })); などと、配列を使ってピンポイントで値を取得していますが これでは使えないので・・ アドバイスよろしくお願いいたします。

    • ベストアンサー
    • Java
  • unicodeファイルの読み込み

    javaアプレット上で BufferedReader file = new BufferedReader(new FileReader("C:/test/list.txt")); で外部テキストファイルを読み込んでいるのですが、この外部テキストファイルの文字コードをANSIからUnicodeに変えるとプログラムが動かなくなります。日本語やアルファベットではない文字の保存のためにテキストをUnicodeにて保存しなければならないのですが、どうすればUnicodeのテキストファイルを読み込むことができますか。

    • ベストアンサー
    • Java
  • CSVデータの読み込みについて

    大変お世話になっております。 CSVデータを読み込みたいのですが、 以下のようになってしまいます。 ----test.csv----- 1,a2,a3 2,a2,a3 3,a2,a3 4,a2,a3 5,a2,a3 6,a2,a3 7,a2,a3 8,a2,a3 9,a2,a3 10,a2,a3 ----------------- //FileReaderでもFileでも結果は同じ // FileReader t_in = new FileReader("test.csv"); File t_in = new File("test.csv"); BufferedReader in = new BufferedReader(new FileReader(t_in)); while (in.ready()) { String line = in.readLine(); System.out.println("lineは " + (line = in.readLine()) + " です。"); } ---------表示結果--------- lineは 2,a2,a3 です。 lineは 4,a2,a3 です。 lineは 6,a2,a3 です。 lineは 8,a2,a3 です。 lineは 10,a2,a3 です。 ------------------------- 1,3,5,7,9はなぜ読み込んでくれないのでしょうか? ご存知の方、いらっしゃったら教えてください。 よろしくお願いします。

    • ベストアンサー
    • Java
  • java ファイル操作

    現在javaでファイル操作しファイルの文字列を検索したりファイルに文字列を追加したりする ものを作成しています。 現状のコードはこのような感じです。 class addresskensaku{ public static void main(String[] args)throws IOException{ System.out.println("数字を選択\n1.名前で検索\n2.年齢で検索\n3.出身地で検索\n4.追加"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); char res = str.charAt(0); //1が選択された場合 if(res == '1' || res == '1'){ System.out.println("名前を入力してください。"); BufferedReader fn = new BufferedReader(new InputStreamReader(System.in)); String str1 = fn.readLine(); try{ FileReader freader = new FileReader("addressdata.txt"); BufferedReader breader = new BufferedReader(freader); String tmp = null; //検索 System.out.println("検索結果 :"); while((tmp=breader.readLine())!=null){ String[] words = tmp.split(","); //部分一致 if(words[0].indexOf(str1) != -1){ System.out.println(tmp); } } breader.close(); }catch(IOException e){ System.out.println("e"); } } //2が入力された場合 if(res == '2' || res == '2'){ System.out.println("年齢を入力してください。"); BufferedReader o = new BufferedReader(new InputStreamReader(System.in)); String ol = o.readLine(); try{ FileReader freader = new FileReader("addressdata.txt"); BufferedReader breader = new BufferedReader(freader); String tmp =null; //検索 while((tmp=breader.readLine())!=null){ String[] words = tmp.split(","); //完全一致 if (ol.equals(words[1])){ // System.out.println("検索結果:"); System.out.println(tmp); } } breader.close(); }catch(IOException e){ System.out.println("e"); } } //3が入力された場合 if(res == '3' || res == '3'){ System.out.println("出身地を入力してください。"); BufferedReader p = new BufferedReader(new InputStreamReader(System.in)); String pref = p.readLine(); try{ FileReader freader = new FileReader("addressdata.txt"); BufferedReader breader = new BufferedReader(freader); String tmp = null; //検索 while((tmp=breader.readLine())!=null){ String[] words = tmp.split(","); //部分一致 if(words[2].indexOf(pref) != -1){ System.out.println(tmp); } } breader.close(); }catch(IOException e){ System.out.println("e"); } } //4が入力された場合 追加 if(res == '4' || res == '4'){ //氏名入力 System.out.println("氏名を入力してください。"); BufferedReader n = new BufferedReader(new InputStreamReader(System.in)); String str2 = n.readLine(); //年齢入力 System.out.println("年齢を入力してください。"); BufferedReader o = new BufferedReader(new InputStreamReader(System.in)); String str3 = o.readLine(); //住所入力 System.out.println("住所を入力してください。"); BufferedReader a = new BufferedReader(new InputStreamReader(System.in)); String str4 = a.readLine(); //ファイルに書き込み try{ File file = new File("addressdata.txt"); FileWriter filewriter = new FileWriter(file, true); filewriter.write(str2+","+str3+","+str4+"\r\n"); filewriter.close(); }catch(IOException e){ System.out.println("e"); } } } } これをカプセル化し 各機能ごとにメソッドを分けて作ろうかなと思っています。 結果の出力はmainでやる予定です。

  • ファイルの読み込み

    "DataFile"に何行か文字列がはいっており、下のソースでそれをテキストボックスにすべて出力したいのですが、1行しか読まれません。 やり方を教えてください。 String moji = null; FileRead(){   try {     BufferedReader br = new BufferedReader( new FileReader( "DataFile.txt" ) );     while ((moji = br.readLine()) != null){       taList.setText(moji);     }     br.close();   }   catch ( Exception e ) {     System.out.println( e.getMessage() );   } }

    • ベストアンサー
    • Java

専門家に質問してみよう