• ベストアンサー

データを取得し、その度に新しい配列に格納したい

こんばんは。 CSVファイルのデータを読み込むクラスを作っています。CSVファイルは30ほどあるので、カンマで区切ったトークンの数(StringTokenizerで区切ったトークンの数)と行数はファイルによって違います。 1つのクラスを作り、データを配列に読み込ませたいと思います。Vectorクラスを使うと出来たのですが、全部String型なので、ストリング型の2重配列に読み込ませたいです。 最初に、配列の宣言をしたのでは、配列のサイズが決まってしまうので、データ数により、配列の大きさを変えたいのですが、うまい方法が見つかりません。 誰か分かる方は、教えてください。よろしくお願いします。

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

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

  • ベストアンサー
  • COOKY2
  • ベストアンサー率28% (2/7)
回答No.2

BufferedReaderに放り込んでから、StringTokenizerに渡せばいかがでしょうか? 私は、XMLファイルをINIファイルとして使用しています。CSVファイルによって、列数、行数、CSVファイルへのパスを持たせておいて、ひとつのアプリで、いろんなパターンに対応させています。。 当然、DOMを扱う、オブジェクトが、必要になってきますが、、、、 FileReader srcFr = new FileReader(strSrcPath); BufferedReader srcBr = new BufferedReader(srcFr); int i = 0; while(srcBr.ready()){ %> <TR bgcolor=#f5fffa> <% tkn = new StringTokenizer(srcBr.readLine(),ptn3); ・・・・・・・以下省略・・・・・・・・

kamkamkam3
質問者

お礼

こんばんは。 すばらしい発想ですね。配列の代わりにDOMを使うということですね。これなら確かにデータ数はお構いなしですね。 う~ん。こんな作り方もあるものですね。私の周りには、Javaが出来る人間があまりいないので、一人で四苦八苦しています。質問してみてよかったです。 まさか、このような解答が来るとは思っていませんでした。ひたすら感心しております。 どうもありがとうございました。がんばって挑戦してみようと思います。VECTORクラスでやるよりも手間がはぶけそうです。

その他の回答 (1)

回答No.1

>最初に、配列の宣言をしたのでは、配列のサイズが決まってしまうので、 >データ数により、配列の大きさを変えたいのですが、 >うまい方法が見つかりません。 配列のサイズを自由に変更するのはVectorやArrayListを使わないと無理です。 強いて言うのなら自分で作るしかないでしょう。 というか、JAVAではサイズが自由に変えられないので、配列は使いませんね。 toArray()で後から配列にするというのでは駄目ですか?

kamkamkam3
質問者

お礼

ご返事ありがとうございます。 Javaでは、出来ないのですね。SEができるというので、調べては見たのですが、できませんよね。私も出来ないと思っていました。 今度自分で作ってみようと思います。どうもありがとうございました。あと、ArrayListは使った事がないので、試してみようと思います。では、ありがとうございました。

関連するQ&A

  • csvファイルをAccessに取り込むとデータ数が増える

    項目をカンマで区切っただけの単純なcsvファイルをAccessでインポートしてテーブルを作成したら、データ数が増えてしまいました。 (csvファイルをテキストで開いたときの行数と、Accessの行数が異なる) 5000件ぐらいなら、csvもAccessもデータ数は同じなのですが、データ数が大きくなると、csvとAccessのテーブルで6万件とかの差分が出てしまいます。 csvファイルとAccessで、データ数を同じにするにはどうしたら良いでしょうか。 参考になるURLでも良いので、教えて頂ければと思います。 よろしくお願いします!

  • カンマで区切られたメールアドレスを配列に格納したい場合

    いつもお世話になっております。 下記のようなStringのデータを配列に格納したいのですが、 private static final String MAILS = "test1@test.com,tes,t2@tes,t.net,test3@te,st.jp"; 普通にカンマで分割するとメールアドレスの形式はめちゃくちゃで配列に格納されてしまいます。 StringTokenizer st = new StringTokenizer(MAILS, ","); String [] mailList = new String[st.countTokens()]; int i = 0; while (st.hasMoreTokens()) { mailList[i] = st.nextToken(); i++; } test1@test.com tes,t2@tes,t.net test3@te,st.jp 上記のようにちゃんとしたメールの形式で配列に格納するにはどうすればいいでしょうか? ご教授頂ければ幸いです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • データベースから取得したデータを配列に格納できません。

    jTableにSQL文の結果を表示させようとして結果を以下のように配列に 格納しようとしました。 public String[][] Serch(){ int i=0; String[][] rowData; String str = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=helloTable.mdb"; try { // ドライバクラスをロード Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // データベースへ接続 Connection con = DriverManager.getConnection(str, "", ""); // ステートメントオブジェクトを生成 Statement stmt = con.createStatement(); String sql = "SELECT * FROM ハローテーブル"; ResultSet rs = stmt.executeQuery(sql); while(rs.next()){ // NOを取得 String no = String.valueOf(rs.getInt("NO")); // 言語を取得 String lang = rs.getString("言語"); // メッセージを取得 String msg = rs.getString("メッセージ"); rowData[i][0] = no; rowData[i][1] = lang; rowData[i][2] = msg; i++; } stmt.close(); con.close(); } catch (Exception e) { e.printStackTrace(); } return rowData; } このメソッドで得た配列を表示させようとすると以下の結果が表示されます。 java.lang.NullPointerException 正常なSQL文の結果は以下の通りです。 1 日本語 こんにちは世界 2 英語 Hello World 3 ドイツ語 Hallo Welt 配列の行数はSQL文の結果の行数に合わせたかったのですがうまくいきません。 どのように直せばSQL文の結果を配列にすべて格納できるでしょうか?

    • ベストアンサー
    • Java
  • JAVA 配列を格納したArrayListのサイズ

    ArrayListにcsvファイルを格納する処理を作成しました。 読み込みはBufferedReaderで行単位で読み込ませ、 ArrayListの各要素には各行をカンマ区切りでわけた配列を 入れてあります。 ここで読み込むcsvファイルがデータなしの時にデータがないことを コメントする処理を入れたいのですが、ArrayListのサイズが0であるという 条件を思いつき、「length」や「size()」で条件文を作成したところ、 コンパイルされても処理が正常に走りませんでした。 条件にしている箇所があっているのか間違っているのか。 あっているならば、配列をしまってあるArrayListの要素数を 得る方法、間違っているならば、正しい条件を教えてください。 大変恐縮ですが、ご助言お願いいたします。 inName : 取り込みファイル名(argsで引っ張っています。) outName : はき出しファイル名(同上) ExceptionはIOとFileNotFoundをcatchしています。 try{ bf = new BufferedReader(new FileReader(inName)); outbf = new BufferedWriter(new FileWriter(outName)); String line; while((line = bf.readLine()) != null){ al.add(line.split(",",0)); /*for(int i=0 ; i < data.length ; i++){ al.add(data[i]); }*/ //行数0の処理を記述しようとしている箇所 } for(String[] out : al){ for(int i=0 ;i<out.length ; i++){ outbf.write(out[i]); outbf.newLine(); } } }

  • ファイルから多次元配列への読み込み

    はじめまして。 ここ最近、業務の都合でjava(正確には主にJSP)を描いています。 プログラムの作成は、シェルスクリプトを少し書く程度でまったく無いに等しい状態のなか、悪戦苦闘しております。 今回は、表題にもありますとおり、カンマ区切りファイルから多次元(2次元)配列に値を入れた意のですが、なかなか上手くいかないので、皆様のお知恵を拝借できればと思い、質問いたしまた。 私が書いたコードは、 String tmp; FileReader fr = new FileReader(application.getRealPath("./a.list")); BufferedReader br = new BufferedReader(fr); //1.リストの行数を取る ArrayList list = new ArrayList(); while (br.ready()) { tmp = br.readLine(); list.add(tmp); } int i = list.size(); //2.リストから読み込んだ値を取り合えず配列に入れてみる。 String strHex [][] = new String [i][3]; String strs2 [] = new String [i]; for ( int jj = 0; jj < i; jj++){ strs2[jj] = (String)list.get(jj); StringTokenizer st2 = new StringTokenizer(strs2[jj],","); int xyz = 0; while (st2.hasMoreTokens()) { strHex [jj][xyz] = (String)st2.nextToken(); xyz++; } } とやってみたのですが、xyzが配列の範囲を超えてアクセスしているという配列使用時はお決まりといわれるエラーが出てしまいます。 xyzは0で初期化した上で、トークンの数だけしか処理を行わないはずなので、わけがわからず途方にくれています。 なお、リストファイルの形式は、4列で行数は不定です。 例) 1,2,3b,4c 5,6,7d,8d 11,12,13,14 ・ ・ 見ないな感じです。 以上、お分かりになる方がいらっしゃいましたら、ヒントだけでもよろしくお願いいたします。

  • 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
  • php配列格納

    $lines = file ('db.csv'); 上記でファイルの中身を配列に入れますがその逆で データを配列にして格納したいのですがどうすればいいのでしょうか? ファイルの不要な行を除いて再度変数に配列で格納しファイルを作成 したいのです。

    • ベストアンサー
    • PHP
  • エクセル2003 string型のデーターの所定文字数の数の取得

    いつもアドバイス頂きありがとうございます。 今回、質問させていただきたいのは、 string型でデーターを取得した文字列に対して ある文字の文字数がいくつ在るかを取得したいのですが VBA関数で、そのような関数はあるのでしょうか? 例  myDataにstring型の文字列を取得してあります。 その中に「,」(カンマ)が何個存在するかと言う事 を取得したい。 やりたい事として、mydata()の中に2次元配列要素となるデーターを 1次元で仮格納してあり、それをセルに書き出すために2次元 に格納(splitで再格納)しなおしているのですが、データーが変わる たびに、カンマの数を数えて配列宣言を記入するのが面倒なので、 カンマの数がいくつでも、2次元に再格納できるようにしたいためで す。 宜しくお願いいたします。

  • データを配列に取り込む

    はじめまして。よろしくお願いいたします。 開発環境 VB6.0 OS:WIN2000 VBを始めたばかりのもので何もわかっていません。 勉強していきたいので皆様ご回答よろしくお願いします。 計測器からデータを配列に取り込むんですが、 配列が4種類あり、その配列をバイナリデータファイル1つにしたいのですが。そんなことできますか? 配列1 WegetScaleData75211モータ回転数     WegetScaleData75211ポンプ流量  配列2 WegetScaleData72351振動     WegetScaleData72351騒音 配列3 WegetScaleData72411トルク 配列4 WegetScaleData72451油温 *配列1,2=2次元配列 *配列3.4=1次元配列 このバイナリデータファイルには1秒に1回計測データ(6種類)が10000個入ってくる。(最長連続運転72時間) バイナリファイルの中にはこんな感じで書き込んでいきたい・・・  時間 モータ回転数 流量 振動 騒音 トルク 油温 1**** 500    0.253  0.222 120 150 32 2**** 500    0.253  0.222 120 150 32 3**** 500     0.253  0.222 120 150 32 4**** 500     0.253  0.222 120 150 32 5**** 500    0.253  0.222 120 150 32 6**** 500    0.253  0.222 120 150 32 7**** 500     0.253  0.222 120 150 32 8**** 500    0.253  0.222 120 150 32 9**** 500     0.253  0.222 120 150 32 10**** 500    0.253  0.222 120 150 32 ・・・ 10000**** 500    0.253  0.222 120 150 32 20000**** 500     0.253  0.222 120 150 32 30000**** 500    0.253  0.222 120 150 32 99999**** 500    0.253  0.222 120 150 32 99999999**** 500    0.253  0.222 120 150 32 ∞     **** 500     0.253  0.222  120 150 32 計測が終わったら、このデータをCSVへ流し書き込む。 以上が流れです。 1:配列にデータを取り込み、バイナリデータとして保存する方法。 2:バイナリデータをCSVへ上記のような表で書き込む方法。 を教えてください。ソースも何もどうしたらいいかわかりません。 何かサンプルでも頂けたら幸いです。 よろしくお願いいたします。

  • 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

専門家に質問してみよう