• ベストアンサー

csvファイルを2次元配列に格納

Javaの勉強をしています。 csvファイルを読み込んで2次元配列に格納する方法を教えて下さい。 1次元の配列なら下記のようにして出来たのですが、2次元の配列に格納する方法が分かりません。 ------------------------------ try { File csv = new File("xxx.csv"); BufferedReader brf = new BufferedReader(new FileReader(csv)); while(brf.ready()) { String line = brf.readLine(); String[] data = line.split(","); for(int j=0; j<data.length; j++) { System.out.print(data[j] + "\t"); } System.out.println(); } brf.close(); } catch(FileNotFoundException e) { e.printStackTrace(); } catch(IOException e) { e.printStackTrace(); } --------------------------- 一度はできないのかと思い、上記の1次元配列のdata[j]を2次元配列のarray[i][j]に代入してみたのですが出来ませんでした。 回答宜しくお願い致します。

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

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

  • ベストアンサー
  • salsberry
  • ベストアンサー率69% (495/711)
回答No.3

#1です。 > ファイル全体の行数はファイルを読み終わってからでないとわからないのですが、その場合どうすればよいのでしょう?? #2の方が書いておられるように、ArrayListなど適当なコレクションクラスにファイルを読み込み、行数が分かってから配列をnewすればいいでしょう。 import java.util.ArrayList; ArrayList<String[]> al = new ArrayList<String[]>(); while (...) { String line = brf.readLine(); al.add(line.split(",")); /* ArrayListへ読み込み */ } String[][] array = new String[al.size()][]; for (i = 0; i < al.size(); i++) { array[i] = al.get(i); /* ArrayListから配列へ */ } 勉強頑張ってください。

Rito24
質問者

お礼

salsberry様、丁寧な解答有難うございます。 無事、プログラムが出来ました。 どうも有難うございました。

その他の回答 (2)

回答No.2

ArrayListにdataを入れるという方法はダメでしょうか? List形式ならばどんどんaddするだけですので。 今のやりかただと1度ファイルをまないとダメですね。

Rito24
質問者

お礼

ProKaseifu様、ご回答有難うございます。 ArrayListを使うのですね。とても参考になりました。

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.1

全体の行数が分からないと、2次元配列array[][]の初期化ができません。 全体の行数を n と仮定するとこんな感じでしょうか。 String[][] array = new String[n][]; /* String[]をn行分確保 */ i = 0; while (...) { String line = brf.readLine(); array[i] = line.split(","); /* i行目をsplit()した結果を代入 */ i++; } for (i = 0; i < n; i++) { for (j = 0; j < array[i].length; j++) { System.out.println("["+i+"]["+j+"] = " + array[i][j]); /* array[i][j]の読み出し */ } } ファイルを読み終わってからでないと全体の行数が分からない場合には、さらに一工夫必要です。

Rito24
質問者

お礼

salsberry様、ご回答どうも有難うございます。 とても参考になりました。 ファイル全体の行数はファイルを読み終わってからでないとわからないのですが、その場合どうすればよいのでしょう?? 適当な行数で2次元配列を初期化してしまうと読み出しで不具合が出てしまいますし・・・ 宜しくお願い致します。

関連するQ&A

  • CSVファイルを多次元配列に格納する

    CSVファイルをopenCSVを読み込んでその行と列の要素数の多次元配列を作りその配列にデータを格納したいです。 しかし、データが格納できません。2回目の格納するためにwhileから何かおかしいのではないかと思っています。 なにかわかる方、アドバイスが欲しいです。 public class ReadCSV { public static void main(String[] args){ try{ CSVReader reader = new CSVReader( new FileReader("/home/masa/Desktop/WameiSample.csv")); //配列の宣言 String[] nextLine; //データを配列に入れる要素数を見る int j = 0; nextLine = reader.readNext(); int k = nextLine.length; System.out.println("列数[i]"+k); System.out.println("nextLine"+nextLine); while((nextLine = reader.readNext()) != null){ for (int i=0; i<nextLine.length; i++){ //System.out.print(nextLine[i] + "|" + i + "|"); } //System.out.println(); j++; } System.out.println("行数[j]"+j); //記憶する配列 String[][] Wamei = new String[k][j]; System.out.println("きてるよ"); //データを配列に格納していく int x = 0; while((nextLine = reader.readNext()) != null){ System.out.println("きてるよ");  <---こっから、表示してくれない. for (int y=0; y<nextLine.length; y++){ Wamei[x][y] = nextLine[y]; //多次元配列の要素を表示する System.out.print(Wamei[x][y]+"Wamei"+x+y); } System.out.println(); x++; } } catch (IOException e) { e.printStackTrace(); } } }

    • ベストアンサー
    • Java
  • CSVファイルを二次元配列に格納するプログラム

    整数のCSVファイルを読み込んで、int型の二次元配列に格納するプログラムを作成中なのですが どうもうまくいきません。 String Str = ""; try { File inFile = new File("./res/test.csv"); FileReader fr = new FileReader(inFile); BufferedReader br = new BufferedReader(fr); ArrayList<String[]> al = new ArrayList<String[]>(); while (br.ready()) { Str = br.readLine(); al.add(Str.split(",")); } int[][] im = new int[al.size()][]; for (int i = 0; i < al.size(); i++) { im[i] = (int)al.get(i); // ここでエラー } br.close(); fr.close(); } catch (Exception e) { System.out.println("ファイル読み込みに関するエラー"); } 他にいい方法ありませんか? また逆で、int型配列に格納されているデータをCSVファイルとして出力する方法もお願いします

  • CSVファイルを二次元配列に格納するプログラム

    前回のソースコードを改変してみました String Str = ""; int Count = 0; try { File inFile = new File("./res/test.csv"); FileReader fr = new FileReader(inFile); BufferedReader br = new BufferedReader(fr); while (br.ready()) { Str = br.readLine(); String[] temp = Str.split(","); int[] m = new int[temp.length]; for (int i = 0; i < temp.length; i++) { m[i] = Integer.parseInt(temp[i]); System.out.print(m[i] + ","); } System.out.println(); Count++; } br.close(); fr.close(); } catch (Exception e) { System.out.println("ファイル読み込みに関するエラー"); } 今一次元配列になっているのですが、これを二次元配列に代入したいのです Countで何回ループしたかによって二次元配列の縦の要素数としたかったのですが、 そうすると横の要素数になるループ中の一次元配列が使えないので困っています

  • jspでの二次元配列

    こんにちは。初めて質問させていただきます。よろしくお願いします。 現在javaで作ったプログラムをjspでも使えるようにしようと考えているのですが、 二次元配列がうまくjspで反映されず困っています。 jspに関してはほとんど無知で一から勉強している次第です。 そのためなるべく簡単に、と思い 以下のプログラムを、<% %>の間に入れるだけで動かせないかと思ったのですが エラーが出てしまいました。一次元の配列ならばできたのですが... ちなみに以下のプログラムはcsvファイルを読み込み、 多次元配列に格納していくというものです。 稚拙なプログラムで申し訳ありません... どなたかご教授いただければ幸いです。 import java.io.*; import java.util.StringTokenizer; import java.util.ArrayList; class Dog{  public static void main(String args[]) throws IOException{      String csv = "dognum.csv";      BufferedReader br = new BufferedReader(new FileReader(csv)); String[][] array = new String[100][]; int i = 0; while (true) { String line = br.readLine(); if(line==null) break; array[i] = line.split(","); i++; } for (i = 0; i < 101; i++) { for (int j = 0; j < array[i].length; j++) { System.out.println("["+i+"]["+j+"] = " + array[i][j]); } } } }

  • BufferedReaderで配列のデータを取り出したい

    PrintWriterで配列のデータを書き込み、 BufferedReaderで書き込んだデータを呼び出したい のですが、下記のソースで書き込むと [Ljava.lang.String;@1add2dd のように表示されてしまいます。 テキストファイルに 1,Server1 のような感じで 書き込んで読み込むにはどのようにしたら いいでしょうか? すみません、ご教授下さい。 よろしくお願いします。 import java.io.*; public class IOTest { public static void main(String[] args) { try{ PrintWriter pr = new PrintWriter( new BufferedWriter(new FileWriter("test.txt")),true); String index = "1"; String serverName = "Server1"; String Server [] = {index, serverName}; pr.println(Server); System.out.println("登録したデータは:" + Server + "です。\n"); BufferedReader br = new BufferedReader( new FileReader("test.txt")); String line; while((line = br.readLine()) != null){ System.out.println("取り出したデータは:" + line + "です。"); } }catch(Exception e){ e.printStackTrace(); } } }

    • ベストアンサー
    • Java
  • ファイルの読み込み、配列に格納

    お世話になります。Java初心者です Javaプログラムを実行する同じディレクトリにあるテキストファイルとデータファイルをコマンドラインで同時に読み込み それぞれ違う配列に格納したいのですが、1つのファイルの読み込みは出来ても2つ同時の読み込みと配列格納でつまづいています。 読み込むテキストファイルには以下のような1行の文が、 Dr. Fujita is great! 読み込むデータファイルには以下のような文字が書かれています。 AC 4C 7C 10C KC 3D 6D 9D QD JB 3C 6C 9C QC 2D 5D 8D JD JA 2C 5C 8C JC AD 4D 7D 10D KD 配列に格納する際、テキストファイルの場合は全て大文字にし、アルファベット以外の記号(スペース含)は全て消して配列に格納します。 上の例でいえばこのような状態で格納です↓ DRFUJITAISGREAT データファイルの場合は、2組1文字をそのまま配列に格納です。ただしスペースは飛ばします。 上の例でいえば、ACを配列0に、4Cを配列1に、7Cを配列2に、、、と格納していきます。 import java.io.*; public class sample{ public static void main(String[] args){ try{ FileReader f = new FileReader(args[0]); BufferedReader b = new BufferedReader(f); Strings; while((s=b.readLine())!=null){ System.out.println(s); ←読み込んでるか確認 } }catch(Exception e){ System.out.println(no file); } } } ファイルの指定は実行時に、java sample datafile.dat textfile.txt と指定します。 読み込むプログラムは以上のように書いたのですが、2つファイルを読み込むにはどのように記述したらよいのでしょうか。 FileReaderを2つ作成?しても最初に指定したデータファイルの内容がまた読み込まれるだけで・・・ 読み込んだら変数sに入りますが、たとえばs.substring()なんかでわけて配列に入れようとしても、s.substring()←ここでエラーが出てしまいます。 あと、Dr. Fujita is great!のアルファベットを大文字にし、記号(スペース含)を飛ばして格納するにはどうしたらよいのでしょうか。 宜しくお願いします

    • ベストアンサー
    • Java
  • 【C#】二次元配列へのcsvファイルの格納について

    いつもお世話になってます。 C#に関して質問です。 VisualC#2008を使用しています。 二次元配列の中にcsvファイルの内容を格納したいと思っています。 一次元配列だと、split(',')のようにコンマで区切って格納することができたのですが、 二次元配列になるとうまくいきません。 作成中のプログラム(一部)は下記のようになっています。 二次元配列になっても、csvファイルをうまく格納できる方法を誰かおしえていただけないでしょうか? よろしくお願いします。 private void 問題ファイルを読み込むXToolStripMenuItem_Click(object sender, EventArgs e) { OpenFileDialog ofd = new OpenFileDialog(); if (ofd.ShowDialog() == DialogResult.OK) { System.IO.Stream stream; stream = ofd.OpenFile(); //StreamReaderオブジェクトの作成 StreamReader sr = new StreamReader(stream, Encoding.GetEncoding(932)); string dat; //文字を入れる while ((dat = sr.ReadLine()) != null) { sbuf = dat.Split(','); //エラー箇所 //DataGridViewに新しい行を追加 int r = dataGridView1.Rows.Add(); dataGridView1[0, r].Value = sbuf[mondai_count,0]; dataGridView1[1, r].Value = sbuf[mondai_count,1]; dataGridView1[2, r].Value = int.Parse(sbuf[mondai_count,2]); //Parseで文字列を数値に変換 } //visible=False でDataGridView非表示 mondai_bun[0] = sbuf[mondai_count,0]; mondai_title[0] = sbuf[mondai_count,1]; mondai_bun2.Text = mondai_bun[0]; this.mondai_list.Items.Add(mondai_title[0]); //ファイルを閉じる sr.Close(); stream.Close(); } }

  • Javaでのカンマで配列を分ける方法

    こんにちは。 カンマ区切りで入力されているデータを2次元配列に格納したいのですがよくわかりません。 それとデータをtxtファイルから入力する方法で配列を入力した分だけ作ることはできますでしょうか? 現在のプログラムは最初に配列を1000個用意する形になっているので効率的とは言えないと思うのですが・・・。 以下プログラムを載せます。 public String[] datain(){ String[] data = new String[1000]; String inputFileName; int i = 0; // 読み込むファイルの名前 inputFileName = "D:\\a.txt"; // ファイルオブジェクトの生成 File inputFile = new File(inputFileName); try { // 入力ストリームの生成 FileInputStream fis = new FileInputStream(inputFile); InputStreamReader isr = new InputStreamReader(fis); BufferedReader br = new BufferedReader(isr); // テキストファイルからの読み込み String d; while ( ( d = br.readLine()) != null ) { data[i] = d; i += 1; } br.close(); } catch(Exception e) { e.printStackTrace(); } return data; } というメソッドです。 戻り値を返した後でも前でもいいので、 --データ-- (a.txt) あ,い,う,え,お か,き,く,け,こ さ,し,す,せ,そ ↓このように取り込みたいのです。 --配列-- [0,0] = あ  [0,1] = い  [0,2] = う  [0,3] = え  [0,4] = お [1,0] = か  [1,1] = き  [1,2] = く  [1,3] = け  [1,4] = こ [2,0] = さ  [2,1] = し  [2,2] = す  [2,3] = せ  [2,4] = そ よろしくお願いします。

    • ベストアンサー
    • Java
  • CSVファイルを , で句切って出力する

    同じ質問になってしまってすみません。 困り度を2ではなく3にしたかったので再掲示してしまいました。 よろしくお願いいたします。 次のような課題が出たのですが教えていただきたく書き込みしました。 皆様のお力をお貸しください。 (1)適当なフォルダにファイルを用意する(ファイルにはCSV形式で文字列が書いてある) (2)最初に文字列をキーボードから入力させる(文字列は半角で5文字まで、それ以外ならば繰り返し入力させる) ※ 指定したファイルがない場合は堤外を出力(try,catch) (3)フォルダのファイル読み込み、(2)で入力した文字列が含まれているCSVのカラムをファイルに出力(ファイルは新規作成 public class Match { public boolean matchString (String[] args) { // マッチング対象の文字列です。 String str = "​http://iwamode.net/index.html";//​ Pattern p = Pattern.compile("^https?://"); // 正規表現のコンパイル Matcher m = p.matcher(str); // 正規表現エンジンの生成 if (m.find()) { // java.util.regex.Matcher#find()メソッドは部分一致するかを判断します。 System.out.println("「http://」または「https://」から始まる文字列です。"); } else { System.out.println("「http://」または「https://」から始まる文字列ではありません。"); } Pattern p2 = Pattern.compile("\\.com"); Matcher m2 = p2.matcher(str); if (m2.find()) { return true; } return false; } } ----------------------------------------------------------- try{ File csv = new File("Kadai10.csv"); // CSVデータファイル BufferedReader br = new BufferedReader(new FileReader(csv)); // 最終行まで読み込む while (br.ready()) { String line = br.readLine(); // 1行をデータの要素に分割 StringTokenizer st = new StringTokenizer(line, ","); while (st.hasMoreTokens()) { // 1行の各要素を区切りで表示 System.out.println(st.nextToken() + ","); } System.out.println(); } br.close(); } catch (FileNotFoundException e) { // Fileオブジェクト生成時の例外捕捉 e.printStackTrace(); } catch (IOException e) { // BufferedReaderオブジェクトのクローズ時の例外捕捉 e.printStackTrace(); } -------------------------------------------------------------- System.out.println("半角5文字までの文字列を入力してください"); BufferedReader r = new BufferedReader(new InputStreamReader(System.in)); String str = r.readLine(); if(str.length() <= 5 && str.matches("[0-9a-zA-Z]")) { 上記の3つの部分ソースを使いプログラムを完成させたいんですがどのようにしたらいいでしょうか?

    • ベストアンサー
    • Java
  • Cで2次元配列にCSVファイルを格納するには?

    ~.csvというファイルがあって、ファイルの中身は256*256のある数字の2次元配列です。 このファイルを読み込んで、2次元配列に格納したいのですが、どのようなソースを書けばいいのでしょうか? プログラミングをちゃんと勉強してこなかったために苦戦しています。 #include <stdio.h> #include <stdlib.h> int main(int argc,char *argv[]){ FILE *fi; char I[256]; char J[256]; if((fi=fopen("ch.csv","r"))==NULL){//csvもこのような記述でよみこむことができるのか? printf("ファイルオープンエラー\n"); exit(1); } while(fgets(J,256,fi) != NULL) { これより先が全く書けていない状態です。 ここまでもこのソースで大丈夫でしょうか? かなり基本的なことだと思いますが、よろしくお願いします。

専門家に質問してみよう