-1

私は学生の詳細(student.txt)を含むテキストファイルからデータを読み取ると想定するアプリケーションを持っています.studentNo、StudentName、Marksなどがあります。.

テキストファイルに含まれるデータのサンプルを次に示します。

20405587    "ZULU,B M"  65  67
20407388    "JUGGERNATH,N"  66  63
20408427    "KHATHI,P X"    60  60
20409821    "SINGH,T"   62  59
20410422    "NKOMO,N N" 58  60

ファイルから読み取るためにスキャナーを使用しています。これまでのコードは次のとおりです。. .それは私にエラーを与える

try
{
   BufferedReader br = new   BufferedReader(new FileReader("student.txt"));
   String line = br.readLine();

   while (line!=null)
   {
        Scanner scan = new Scanner(line);   
        scan.useDelimiter(" ");
        String dummystudent=scan.next();
        int studentNo= Integer.parseInt(dummystudent);
        String dummyname1 = scan.next();
        String dummyname2 = scan.next();
        String studentName = dummyname1+dummyname2;
        String dummytest1 = scan.next();
        int test1= Integer.parseInt(dummytest1);
        String dummytest2 = scan.next();
        int test2= Integer.parseInt(dummytest2);
        tad1.setText(tad1.getText()+"Student Number: " + studentNo + '\n' + "Student Name :" + studentName );

        line = br.readLine();
    } 
    br.close();
}
catch(Exception b)
{
    JOptionPane.showMessageDialog(null,b.getMessage());
}
4

4 に答える 4

0

あなたの解析はやり過ぎのようです。

Scanner を使用して行を読み取り、 StringUtils.split() を使用して行を解析することを検討してください。

ここにいくつかのコードがあります:

public static void main(String[] args)
    {
        int インデックス = 1; // 印刷専用。

        for (文字列電流: 入力)
        {
            文字列[]分割1; // 結果: 数字、名前、数字
            文字列[] split2;
            文字列 StudentName1;
            文字列 StudentName2;
            文字列学生番号;
            文字列 testScore1;
            文字列 testScore2;

            split1 = StringUtils.split(current, '"');

            StudentNumber = StringUtils.trim(split1[0]);

            split2 = StringUtils.split(split1[1], ',');

            studentName1 = StringUtils.trim(split2[0]);
            studentName2 = StringUtils.trim(split2[1]);

            split2 = StringUtils.split(split1[2]); // デフォルトの区切り文字は空白です。

            testScore1 = StringUtils.trim(split2[0]);
            testScore2 = StringUtils.trim(split2[1]);

            System.out.println(
                インデックス + ":" +
                " 番号: " + ">" + 生徒番号 + "" + 生徒名 1 + "" + 生徒名 2 + "" + testScore1 + "" + testScore2 + "

注: StringUtils はApache Commons Langからのものです。

于 2013-07-29T18:01:16.120 に答える
0

区切り文字を単一のスペースに設定します。これが問題です。nextあなたの行には複数の連続したスペースがあるため、空の文字列が数回返されます。

代わりに、 1 つ以上のスペースを言いたい:

sc.useDelimiter(" +");

"ZULU,B M"真ん中にスペースがあり、そうでないので、まだ100%ではあり"JUGGERNATH,N"ませんが、それはあなたに任せます. 多分:

sc.useDelimiter("\"");

真ん中のどこか。

+正規表現と関係があります。一般的なものについてはこちらを、Java 固有のものについてはこちらを参照てください。

于 2013-07-29T17:40:38.263 に答える
0

delimiter を使用する必要が"? +"?あります。delimiter は正規表現であり、文字列にはフィールドを区切るための複数のスペースがあります。文字列フィールドの周りの引用符も考慮する必要があります。文字列フィールドをスペースで解決する方法をまだ試していません。

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Scanner.html#useDelimiter(java.lang.String)


正規表現を使用すると、以下の正規表現文字列を使用してそれを行うことができ、Matcherを介してサブグループ 1 ~ 4 を選択できます。

([0-9]{8}) +"([A-Z, ]+)" +([0-9]{2}) +([0-9]{2})
于 2013-07-29T17:38:37.817 に答える