-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

您将分隔符设置为一个空格。这就是问题。next将返回一个空字符串几次,因为你的那些行有多个连续的空格。

相反,您想说一个或多个空格:

sc.useDelimiter(" +");

它仍然不是 100% "ZULU,B M",因为中间有一个空格并且"JUGGERNATH,N"没有,但我会让你自己弄清楚。也许:

sc.useDelimiter("\"");

在中间的某个地方。

+与正则表达式有关,更多信息请参见this ,更多Java特定请参见this 。

于 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)


使用正则表达式,您应该能够使用下面的正则表达式字符串来执行此操作,并通过匹配器选择子组 1-4

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

最简单的结束方式是一行一行地走。

Pattern filePatten = Pattern.compile("\\s*(\\d+)\\s+(\"[^\"]+\")\\s+(\\d+)\\s+(\\d+)\\s*");
while (scanner.hasNextLine()) {
    String line = scanner.nextLine();
    Matcher matcher = filePattern.matcher(line);
    if (matcher.matches()) {
       String id = matcher.group(1);
       String name = matcher.group(2);

       //etc
    } else {
       //Warn : Fragile Regex
    }
}

正则表达式中的每个组都捕获该行的一部分。第二组使用引号捕获名称。您可能想要删除它。

于 2013-07-29T18:10:48.727 回答
0

您的解析似乎是矫枉过正。

考虑使用 Scanner 读取该行并使用 StringUtils.split() 解析该行。

这是一些代码:

公共静态无效主要(字符串 [] 参数)
    {
        整数索引 = 1;// 仅用于打印。

        对于(字符串当前:输入)
        {
            字符串 [] 拆分 1;// 结果:数字、名称、数字
            字符串 [] 拆分 2;
            字符串学生姓名1;
            字符串学生姓名2;
            字符串学生号;
            字符串 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(
                索引 + ":" +
                " 数字:" + ">" + studentNumber + "" + studentName1 + "" + studentName2 + "" + testScore1 + "" + testScore2 + "

注意:StringUtils 来自Apache Commons Lang

于 2013-07-29T18:01:16.120 回答