在stackoverflow中验证this post之后,我使用indexOf()
方法来解析文件中的值。以下是我的文件格式 -
10/05/2005 10:02;AM;a@xyz.com;student=student1 std=X marks=87 rollnumber=102
10/05/2005 10:05;AM;b@xyz.com;student=student2 std=IX rollnumber=26
10/05/2005 10:15;PM;c@xyz.com;student=student3 std=VII marks=87 attandance=5 rollnumber=12
10/05/2005 10:32;AM;d@xyz.com;student=student4 std=V marks=87 rollnumber=69
注意:电子邮件中的domain name
即xyz.com
不会在任何地方更改。
以下是我目前使用的代码段 -
FileInputStream fis = new FileInputStream(file);
BufferedReader br = new BufferedReader(new InputStreamReader(
fis));
String line = "";
while ((line = br.readLine()) != null) {
int index = -1;
if ((index = line.indexOf("xyz.com")) != -1) {
int inStudent = line.indexOf("student=", index);
int spaceExistsinStudent = -1;
int studentIndex = -1;
if ((spaceExistsinStudent = line.indexOf("student=\"", inStudent)) != -1)
studentIndex = line.indexOf(" ", inStudent);
else
studentIndex = line.indexOf("\" ", spaceExistsinStudent);
int inSTD = line.indexOf("std=", studentIndex);
int spaceExistsinSTD = -1;
int stdIndex = -1;
if ((spaceExistsinSTD = line.indexOf("std=\"", inSTD)) != -1)
stdIndex = line.indexOf(" ", inSTD);
else
stdIndex = line.indexOf("\" ", spaceExistsinSTD);
String studentName = line.substring(inStudent + 9, studentIndex);
String stdName = line.substring(inSTD + 4, stdIndex);
没有必要粘贴整个代码。
好吧,使用上面的实现,我能够工作,但这是有效的解决方案,因为性能考虑?任何更好的方法来实现同样的目标....
提前谢谢你。
答案 0 :(得分:2)
我建议使用StringTokenizer而不是indexOf()。基本上你可以根据一些分隔符(例如:;)..
拆分你while循环中的示例
StringTokenizer st = new StringTokenizer(line,";");
st.nextToken(); //Date
st.nextToken(); //AM
String email = st.nextToken();
String values = st.nextToken();
StringTokenizer st2 = new StringTokenizer(values," ");
while (st2.hasMoreElements()) {
String token = (String) st2.nextElement();
if(token.startsWith("student=")){
System.out.println(token.substring("student=".length()));
}else if(token.startsWith("std=")){
System.out.println(token.substring("std=".length()));
}
}
答案 1 :(得分:1)
您无需为所有内容使用indexOf。如果你想查看一个字符,你可以使用charAt(),例如在哪里检查'''
我会使用一种方法来提取字段的值以简化代码。
答案 2 :(得分:1)
正如我在之前的评论中所说,我很惊讶解析是这里的瓶颈。但是,如果你想知道其他方法可以做到这一点,只是尝试一下,看看哪个是最快的,这里还有两个没有发布的想法 - 使用.split
:
String[] arr1 = line.split(";");
String dateTime = arr1[0];
String ampm = arr1[1];
String email = arr1[2];
String[] arr2 = arr1[3].split(" ");
String student, std, marks, rollnumber;
student = std = marks = rollnumber = null;
for (String str : arr2) {
String value = str.substring(str.indexOf("=") + 1);
switch(str.charAt(2)) {
case 'u': student = value; break;
case 'd': std = value; break;
case 'r': marks = value; break;
case 'l': rollnumber = value; break;
}
}
或使用正则表达式:
private static final Pattern PATTERN = Pattern.compile("([^;]+);([^;]+);([^;]+);student=([^ ]+) std=([^ ]+) marks=([^ ]+) rollnumber=([^ ]+)");
Matcher m = PATTERN.matcher(line);
m.find();
String dateTime = m.group(1);
String ampm = m.group(2);
String email = m.group(3);
String student = m.group(4);
String std = m.group(5);
String marks = m.group(6);
String rollnumber = m.group(7);