Java初心者のためのファイル読み込みと配列格納方法

このQ&Aのポイント
  • Java初心者のために、ファイルの読み込みと配列への格納方法を解説します。
  • 質問者は、2つのファイルを同時に読み込み、それぞれ異なる配列に格納したいとのことですが、どのように記述すればよいのか分からないとのことです。
  • また、テキストファイルからの読み込み時にはアルファベットを大文字にし、記号(スペース含)は除外して配列に格納する方法を教えてください。
回答を見る
  • ベストアンサー

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

お世話になります。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
  • 回答数2
  • ありがとう数2

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

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

まずコンパイルエラーの対処方法ですが >System.out.println(no file); ここはno fileという文字列を標準出力したいのでしょうか? そうであれば、no fileを"no file"の様に""で囲んであげてください。 >String[] da = s.split("\\s+"); ←ここのsでエラー。変数sが見つけられないと出ます・・・ >s2 = s2.toUpperCase(); ←ここのs2でエラー。sと同じエラーです >String[] ta = s2.split("[^A-Z]+"); ←ここのs2でエラー 変数sとs2がスコープ切れしています。 ローカル変数のスコープは宣言したブロックの内側で、宣言した行以降で有効です。 ですので、try{~}の中の処理に続けて記述してやれば良いと思います。 ですが、それでコンパイルが通っても、以下の記述に問題があるので、恐らく実行時例外がおきます。 >while((s=b.readLine())!=null){ >} >while((s2=b2.readLine())!=null){ >} このやり方ではwhileブロック終了後のsとs2は常にnullになります。 よって、後のsplitメソッドを呼ぶ段でNullPointerExceptionがスローされるはずです。 ファイルの内容を一行取得するだけであれば、whileを使う必要は無いです。 改行文字を含んでいる場合を考慮する必要があるならば、それならそれで、もう少し工夫が必要です。 以上です。

lockwell
質問者

お礼

ご指摘の通り直したらできました!ありがとうございました! 実はもう一つ、ファイルの書き込みでつまづいています。 もしよろしければご教授ください。 本当にありがとうございました!

その他の回答 (1)

回答No.1

>読み込むプログラムは以上のように書いたのですが、2つファイルを読み込むにはどのように記述したらよいのでしょうか。 >FileReaderを2つ作成?しても最初に指定したデータファイルの内容がまた読み込まれるだけで・・・ ソースの中で FileReader f = new FileReader(args[0]); としている箇所がありますが、 String[] argsの中にはコマンドライン引数として渡された文字列が空白文字区切りで区切られて格納されます。 >ファイルの指定は実行時に、java sample datafile.dat textfile.txt と指定します。 この場合ですと、 args[0] =>datafile.dat args[1] =>textfile.txt という風に格納されているという事ですね。 ファイルの読み込みに関してはその辺りを考慮して少し修正を加えれば問題無いと思います。 読み込んだ文字列を配列に格納する方法に関してですが、 簡単な実装方法としては文字列をStringクラスのsplitメソッドで分割してやるという方法があります。 <例> //datafile.dat String df = "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"; //1文字以上連続する空白文字を区切り文字とみなして正規表現で分割して配列に格納 String[] da = df.split("\\s+"); //textfile.txt String tf = "Dr. Fujita is great!"; //大文字に変換 tf = tf.toUpperCase(); //1文字以上連続するアルファベット以外の文字を区切り文字とみなして正規表現で分割して配列に格納 String[] ta = tf.split("[^a-zA-Z]+"); 以上です。

lockwell
質問者

補足

ありがとうございます。ファイルの読み込みとsplitメソッド非常に参考になりました! しかしファイルを読み込んでも配列に格納のところでエラーが出てしまいます。 String s; while((s=b.readLine())!=null) この記述だと、sに"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"が代入されたことになるのですよね? つまりmiyajima24さんの例で言えばsがString df と同じですよね。 なので、splitでわけるために、String[] da = s.split("\\s+");と記述したのですが、 s.splitのsの部分でエラーがでます。sはStringで定義しているのでmiyajima24さんのString df と同じはずなのですが・・・ import java.io.*; public class sample{ public static void main(String[] args){ try{ FileReader f = new FileReader(args[0]); FileReader f2 = new FileReader(args[1]); BufferedReader b = new BufferedReader(f); BufferedReader b2 = new BufferedReader(f2); String s, s2; //data fileの読み込み while((s=b.readLine())!=null){ } //text fileの読み込み while((s2=b2.readLine())!=null){ } }catch(Exception e){ System.out.println(no file); } String[] da = s.split("\\s+"); ←ここのsでエラー。変数sが見つけられないと出ます・・・ s2 = s2.toUpperCase(); ←ここのs2でエラー。sと同じエラーです String[] ta = s2.split("[^A-Z]+"); ←ここのs2でエラー } } なぜこのsでエラーが出るのでしょうか?

関連するQ&A

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

    質問のタイトル通りなのですが、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ファイルを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
  • ファイルからの読み込み 配列

    座標データの数値のテキストファイルから配列の中に座標値を格納したいのですが、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型の場合どのようにすればよろしいのでしょうか?教えてください。お願いします。

  • C#で、ファイルのデータを取得し、配列に格納

    C#を始めたばかりで分からないことも多いため、質問させていただきます。 C#で、テキストファイルにある2進数の数値 例: 00111100 11111100 00010100 のような8桁のデータをC#でテキストファイルから2進数のまま読み取り、 配列に格納したいです。 上の例で考えると、 byte[0]に 00111100 byte[1]に 11111100 byte[2]に 00010100  のデータが入力されているような感じです。 ArrayListを使用する方法や、 バイナリファイルで読み込む方法などもあると思うのですが、 データを1行ごとに配列に入力し、 それを見た目どおり2進数として格納する方法が分かりません。 やはり、文字コードなどを参考に、 1文字ずつ格納し、引き算していくしか方法はないのでしょうか? 文章が分かりにくくて申し訳ないのですが、回答いただけるとありがたいです! よろしくお願いいたします。

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

    すみません、初心者です。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
  • unicodeファイルの読み込み

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

    • ベストアンサー
    • 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ファイルとして出力する方法もお願いします

  • C言語 文字列格納

    テキストファイルから整数データ又は文字列を読み込んで配列に格納する動作についての質問です。 テキストファイルが1行区切りの整数型なら1次元配列で for(i = 0; i < maxSize; i++) { fscanf(fp,"%d", &data[i]); } テキストファイルが1行区切りの文字列なら2次元配列で for(i = 0; i < MAXSIZE; i++) { if (fscanf(fp,"%s", &data[i][300]) == EOF) break; } for(j = 0; j < i; j++) printf("%s\n", data[j]); みたいな具合に格納できたんですが、 テキストファイルが1行区切りのデータではなく、空白文字区切りの文字データだった場合、それぞれどのようにして配列に格納すればいいかがわかりません。 イメージとしては、1文字目から見ていって空白が出ればそこで切って格納していくというかんじなのですが・・・ 質問の内容がわかりにくいかもしれませんが、是非教えてください。お願いします。

  • 【C#】テキストファイルを2進数で取得&配列に格納

    http://okwave.jp/qa/q7812279.html 前回の質問が分かりにくかったため、もっと詳しく書いていこうと思います。 テキストファイルを1行ずつ読み取り、それをbyte型に保存したいです。 例:test.txt 01001000 01110000 01010100 11100110 01010101 ↑のような8桁の2進数がテキストファイルに記入されています。 そのテキストファイルを読み取り、 byte配列に格納したいです。 例: byte[0]に01001000 byte[1]に01110000 byte[2]に01010100 byte[3]に11100110 上記のようにデータが格納されるよう、 ファイルを読み取り、配列に入れたいと思っています。 C#初心者のため、右も左も分からないのですが、 とりあえず、やろうとしている流れを以下に書きます。 (1)ファイルを読み込む (2)ArrayListに格納 (3)データ変換(文字列を2進数に) (4)データの出力(byte型) ArrayListでなくても構わないのですが、 他にいい方法が思いつかなかったので…。 言いたいことがぐちゃぐちゃになってきたのでまとめると、 byte[0]にファイルから読み取った1行のデータ(01001011等)を byte型で入力したい。 ということです。 分からなければ、コメントお願い致します。 文章が雑で分かりにくいかもしれませんが、回答頂けると嬉しいです。

  • ファイル内の文字を配列に格納

    ファイル内の文字列をも表示させた上で、文字列を配列に1つずつ格納したいのですが、とっても簡単な方法で教えてください。 ファイル名は「abc」で配列名は「moji」でお願いします。