从文本文件中读取数据时出错

时间:2013-07-29 17:32:04

标签: java

我有一个应用程序,假设使用学生详细信息(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

我正在使用扫描程序从文件中读取,这是我的代码到目前为止。 。 .it给了我一个错误

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 个答案:

答案 0 :(得分:0)

您应该使用分隔符"? +"?,分隔符是正则表达式,并且您的字符串有多个空格来分隔字段,您还需要考虑字符串字段周围的引号。我还没有研究如何用空格解决字符串字段。

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


使用正则表达式,你应该能够使用下面的正则表达式字符串,并选择子组1-4,通过Matcher

([0-9]{8}) +"([A-Z, ]+)" +([0-9]{2}) +([0-9]{2})

答案 1 :(得分:0)

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

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

sc.useDelimiter(" +");

它仍然不是100%,因为"ZULU,B M"中间有空格而"JUGGERNATH,N"没有,但我会留给你弄清楚。也许:

sc.useDelimiter("\"");

在那里的某个地方。

+与正则表达式有关,请参阅this以获取更多信息,this了解更多特定于Java的信息。

答案 2 :(得分:0)

你的解析似乎有点矫枉过正。

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

以下是一些代码:

 public static void main(String[] args)
    {
        int index = 1; // Just for printing.

        for (String current : input)
        {
            String[] split1; // result: number, name, numbers
            String[] split2;
            String studentName1;
            String studentName2;
            String studentNumber;
            String testScore1;
            String 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]); // default seperator is whitespace.

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

            System.out.println(
                index + ":" +
                " Number: " + ">" + studentNumber + "" + studentName1 + "" + studentName2 + "" + testScore1 + "" + testScore2 + "

注意:StringUtils来自Apache Commons Lang

答案 3 :(得分: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
    }
}

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