Javaでファイルから一行を読み込み配列に格納する方法

このQ&Aのポイント
  • Javaでテキストファイルから一行の文字列を読み込み、Stringの配列に格納する方法をご教示ください。
  • 配列のサイズを動的に設定し、ファイルの行数に応じて宣言する方法を教えてください。
  • テキストファイルから空白行を無視して文字列を読み込んで配列に格納する方法を教えてください。
回答を見る
  • ベストアンサー

ファイルから一行を読み込み配列に格納したい

すみません、初心者です。Javaでテキストファイルから一行の文字列を読み込み、Stringの配列に格納したいと思っています。具体的には、マシンの/tmp/test.txtを読み込み、空白行は無視して格納したいです。ウェブを参考にして、以下のようには出来たのですが、最初にStringの配列を20個宣言しており、これをどうにかテキストファイルの行(マイナス空白行)の数だけ宣言させたいです。(理由はファイルによっては想定以上の個数の場合も有り得ますし、余分なメモリを使用することになるのと、後からこの配列を使用しやすい、といった諸々で。。)以下のコードをどのように変えると実現出来るかご教示頂けませんでしょうか。 (一行あたりの文字列はつながっており、空白が間に入る事はありません) import java.io.*; public class test { public static void main(String[] args) throws Exception { int i=0; String[] str = new String[20]; FileReader fr = new FileReader("/tmp/test.txt"); StreamTokenizer st=new StreamTokenizer(fr); while(st.nextToken()!=StreamTokenizer.TT_EOF) { System.out.println(st.sval+" "); str[i]=st.sval; i++; } fr.close(); } } (test.txtが以下の場合) ----------------------- fdjosa djsoafdjfdajof jsoafds fdsaoofdafd fdjso fjds ----------------------- (配列は以下になることを想定) str[0]=fdjosa str[1]=djsoafdjfdajof str[2]jsoafds str[3]=fdsaoofdafd str[4]=fdjso str[5]=fjds (*配列数であるstr.lengthは6)

  • Java
  • 回答数1
  • ありがとう数1

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

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

Listを使ってみてはいかがでしょう? 空白行を飛ばすのなら、 if(st.sval.equals("")) continue; とかどうでしょう?

参考URL:
http://www.j2ee.me/javase/ja/6/docs/ja/api/java/awt/List.html
rio_grande
質問者

お礼

ありがとうございました。できました。

関連するQ&A

  • 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ファイルとして出力する方法もお願いします

  • 文書を読み込み配列に格納

    質問のタイトル通りなのですが、Javaプログラミングで 例えば、 1.2;2.3;1.0; 5.3;0.3;0.5; 1.4;4.2;2.2; といった3行の文書があるとして、この文書を読み込み、配列d[3][3] に格納するにはどのようにすればよいでしょうか。 d[0][0]=1.2、d[0][1]=2.3、d[0][2]=1.0、d[1][0]=5.3といった具合に 格納したいのです。数値はdouble型で格納しようしています。 とりあえず、 BufferedReader br = new BufferedReader(new FileReader("○○")); で読み込み、 String str = null; String[] str1 = null; String regex = ";"; を用意しておいて、 while((str = br.readLine()) != null){ str1 = str.split(regex); } で数値を分割するところまでできています。 ここからString型からDouble型に変換して、d[3][3]に格納したいと 思っていますが、やり方がよくわかりません。 よろしくおねがいします。

  • 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で何回ループしたかによって二次元配列の縦の要素数としたかったのですが、 そうすると横の要素数になるループ中の一次元配列が使えないので困っています

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

    いつもお世話になっております。 下記のような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
  • ファイルから多次元配列への読み込み

    はじめまして。 ここ最近、業務の都合で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 ・ ・ 見ないな感じです。 以上、お分かりになる方がいらっしゃいましたら、ヒントだけでもよろしくお願いいたします。

  • ファイルの読み込み、配列に格納

    お世話になります。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
  • 変数を配列に格納する時に、二つの条件を指定すること

    変数を配列に格納する時に、二つの条件を指定することはできますか? VBAです。 Private Sub test() Dim i As Long Dim Str As String Dim tmp As Variant Str = "a,i,u-e-o" tmp = Split(Str, ",") '配列に格納する For i = LBound(tmp) To UBound(tmp) Debug.Print tmp(i) Next i End Sub の場合、結果が a i u-e-o になってしまいます。 tmp = Split(Str, "," or "-") のようなことをして a i u e o と表示させたいです。 "a,i,u-e-o"を"a,i,u,e,o"にすることはできません。ご教授よろしくお願いします。

  • ファイルからの読み込み 配列

    座標データの数値のテキストファイルから配列の中に座標値を格納したいのですが、int型のデータを読み込んで配列に格納するのは、どのようにプログラムを組めばよろしいのでしょうか?下のようにxzahyou.csvというファイルから配列Z[i]に格納したくて組んでみたら、 br = new BufferedReader(new FileReader("xzahyou.csv")); for(int i=0;i<X.length;i++){ String line = br.readLine(); X[i]=line; X[i] = line;のところで互換性がないと出てきました。int型の場合どのようにすればよろしいのでしょうか?教えてください。お願いします。

  • javaでの文字列からの数字抽出

    文字列内の数字だけを取り出したいとおもっています。 たとえばファイル内からreadline()で読み込んだ文字列が [0, 0] [-0.34063, 0.0756989] [-0.362579, 0.118652] [-0.36264, 0.118637] だったならば 配列内に {0,0,-0.34063,0.0756989,-0.362579,0.118652,-0.36264,0.118637 } のように格納したいのですが可能なんでしょうか? "["や空白のようなものを削除して数字だけを取り出したいのです。 現在はこのようにファイルの文字列を取得しています FileReader fr = new FileReader(inputpath); BufferedReader br = new BufferedReader(fr); String read = br.readLine(); よろしくお願いします。

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