9

情報を含むファイルがあります。次のようになります。

    Michael 19 180 Miami
    George 25 176 Washington
    William 43 188 Seattle

行と文字列を分割して読みたい。私はそれが次のようになりたい:

    Michael
    19
    180
    Miami
    George
    ...

私はこのようなコードを使用しました:

    BufferedReader in = null;
    String read;
    int linenum;
    try{
        in = new BufferedReader(new FileReader("fileeditor.txt")); 
    }
    catch (FileNotFoundException e) {System.out.println("There was a problem: " + e);}
    try{
        for (linenum = 0; linenum<100; linenum++){
            read = in.readLine();
            if(read == null){} 
            else{
                String[] splited = read.split("\\s+");
                System.out.println(splited[linenum]);
           }
       }
    }
    catch (IOException e) {System.out.println("There was a problem: " + e);} 
}

これが私に与えたものは

    Michael
    25
    188

おそらく for ループの問題だと思いますが、私はプログラミングがあまり得意ではないので、助けていただければ幸いです。ありがとう。

4

3 に答える 3

10

あなたはそこに途中まで来ています。それは素晴らしいことです。

ファイルを読み取る場合、ストリームの最後に到達するReaderと が戻ります。つまり、他に読み取ることができるものはありません。nullあなたの現在のアプローチは、少なくとも100行を読みたいということを意味しますが、それ以上は必要ありません...これは、ファイルサイズが大きくなると将来的に問題になります...また、やや無駄です

代わりに、null値がファイルの終わりを示すという事実を使用する必要があります..

行を分割すると、多数の要素が含まれます。linenumこれらを印刷するために変数を使用しています。問題は、すでに行を読み取って分割していることlinenumです。これは、分割したばかりの文字列の一部ではなく、既に読み取った行の数を表すため、このタスクには関係ありません。

代わりに、内側のループを使用して、各行の個々の分割要素を表示する必要があります...

例えば...

BufferedReader in = null;
try {
    in = new BufferedReader(new FileReader("fileeditor.txt"));
    String read = null;
    while ((read = in.readLine()) != null) {
        String[] splited = read.split("\\s+");
        for (String part : splited) {
            System.out.println(part);
        }
    }
} catch (IOException e) {
    System.out.println("There was a problem: " + e);
    e.printStackTrace();
} finally {
    try {
        in.close();
    } catch (Exception e) {
    }
}

また、開いた場合はかび臭く閉じてしまうことを忘れないでください ;)

基本的な I/Oについても、もう少し時間がかかる場合があります ;)

于 2013-09-04T07:11:35.267 に答える
2
 String[] splited = read.split("\\s+");
  for (int i= 0; i<splited.length; i++){
  System.out.println(splited[i]);
  }

文字列を分割した後、結果をループする必要があります。

于 2013-09-04T07:05:45.987 に答える
1

を使用できますStreamTokenizer。設定に従って、ストリームをトークンに分割します。あなたの質問から、行末をトークン区切り記号として扱いたいと思います。コードは次のようになります。

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.StreamTokenizer;

public class ReaderSample {

    public static void main(String[] args) {
        BufferedReader in = null;
        try {
            in = new BufferedReader(new FileReader("fileeditor.txt"));
            StreamTokenizer st = new StreamTokenizer(in);
            st.eolIsSignificant(false);
            // remove comment handling
            st.slashSlashComments(false);
            st.slashStarComments(false);

            while(st.nextToken() != StreamTokenizer.TT_EOF) {
                if (st.ttype == StreamTokenizer.TT_NUMBER) {
                    // the default is to treat numbers differently than words
                    // also the numbers are doubles
                    System.out.println((int)st.nval);
                }
                else {
                    System.out.println(st.sval);
                }
            }
        }
        catch(IOException ex) {
            System.err.println(ex.getMessage());
        }
        finally {
            if (in != null) {
                try {
                    in.close();
                }
                catch (IOException ex) {
                }
            }
        }
    }
}

入力に対して何をする必要があるかに応じて、さまざまなオプションを設定する必要がある場合があります。ここでは、ドキュメントが役立ちます。

于 2013-09-04T07:44:25.953 に答える