我有一个应用程序,假设使用学生详细信息(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());
}
答案 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("\"");
在那里的某个地方。
答案 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
}
}
正则表达式中的每个组都会捕获该行的一部分。第二组用引号捕获名称。您可能想要将其删除。