使用Java将文本文件中的数据解析为多个数组
首先让我说我是Java的新手,所以如果我犯了明显的错误,请原谅我……
我有一个文本文件,我必须从中读取数据并将数据拆分为单独的数组。
文本文件包含此格式的数据(尽管如果有必要,可以稍微修改一下,如果它是唯一的方法,则可以使用标识符标记)
noOfStudents
studentNAme studentID numberOfCourses
courseName courseNumber creditHours grade
courseName courseNumber creditHours grade
courseName courseNumber creditHours grade
。
。
studentNAme studentID numberOfCourses
courseName courseNumber creditHours grade
courseName courseNumber creditHours grade
courseName courseNumber creditHours grade
。
。
第一行表示将列出的“学生”总数,需要将其移动到数组。 一个数组将包含学生信息
studentName,studentID,numberOfCourses
到一个数组,和
courseName,courseNumber,creditHours,grade
到第二个数组。
我的问题源于如何解析这些数据。
我正在读第一行,转换为int并使用它来确定我的学生数组的大小。 之后,我不知道如何将数据移动到数组中并让我的程序知道哪个数组移动哪些行。
需要注意的一点是,每个学生所选课程的数量是可变的,所以我不能简单地将1行读入一个数组,然后将3行读入下一个数组,等等。
我需要使用标识符还是我错过了一些明显的东西? 我一直在看这个问题一个星期了,此时我只是感到沮丧。
任何帮助是极大的赞赏! 谢谢
编辑:这是我目前正在处理的代码部分。
public static void main(String args[]) { try{ // Open the file FileInputStream fstream = new FileInputStream("a1.txt"); // Get the object of DataInputStream DataInputStream in = new DataInputStream(fstream); BufferedReader br = new BufferedReader(new InputStreamReader(in)); String strLine; // temporarily holds the characters from the current line being read String firstLine; // String to hold first line which is number of students total in file. // Read firstLine, remove the , character, and convert the string to int value. firstLine = br.readLine(); firstLine = firstLine.replaceAll(", ", ""); int regStudnt = Integer.parseInt(firstLine); // Just to test that number is being read correctly. System.out.println(regStudnt + " Number of students\n"); // 2D array to hold student information String[][] students; // Array is initialized large enough to hold every student with 3 entries per student. // Entries will be studentName, studentID, numberOfCourses students = new String[3][regStudnt]; //Read File Line By Line while ((strLine = br.readLine()) != null) { // Split each line into separate array entries via .split at indicator character. // temporary Array for this is named strArr and is rewriten over after every line read. String[] strArr; strArr = strLine.split(", "); } //Close the input stream in.close(); }catch (Exception e){//Catch exception if any System.err.println("Error: " + e.getMessage()); } }
我希望这有助于某人引导我朝着正确的方向前进。
我想从这一点开始我遇到的主要问题是如何以这样的方式循环,即将学生信息读取到学生数组,然后将课程信息读取到相应的课程数组位置,然后重新开始学生,直到所有学生都被阅读。
试试这个代码段,我认为它完全符合您的要求。 如果您有任何困惑,请告诉我!
class course { String name; int number; int credit; String grade; } class student { String name; String id; int numberCourses; course[] courses; } class ParseStore { student[] students; void initStudent(int len) { for (int i = 0; i < len; i++) { students[i] = new student(); } } void initCourse(int index, int len) { for (int i = 0; i < len; i++) { students[index].courses[i] = new course(); } } void parseFile() throws FileNotFoundException, IOException { FileInputStream fstream = new FileInputStream("test.txt"); DataInputStream in = new DataInputStream(fstream); BufferedReader br = new BufferedReader(new InputStreamReader(in)); int numberStudent = Integer.parseInt(br.readLine()); students = new student[numberStudent]; initStudent(numberStudent); for (int i = 0; i < numberStudent; i++) { String line = br.readLine(); int numberCourse = Integer.parseInt(line.split(" ")[2]); students[i].name = line.split(" ")[0]; students[i].id = line.split(" ")[1]; students[i].numberCourses = numberCourse; students[i].courses = new course[numberCourse]; initCourse(i, numberCourse); for (int j = 0; j < numberCourse; j++) { line = br.readLine(); students[i].courses[j].name = line.split(" ")[0]; students[i].courses[j].number = Integer.parseInt(line.split(" ")[1]); students[i].courses[j].credit = Integer.parseInt(line.split(" ")[2]); students[i].courses[j].grade = line.split(" ")[3]; } } } }
您可以在执行ParseStore
之后通过打印students
数组的内容来测试它
当新学生开始时,拥有一个标识符(可能是一个空行)会让你很容易,就像你可以做到的那样
if("yourIdentifier".equals(yourReadLine))
这是一些应该让你走上正轨的伪代码:
Student[] readFile() { int noOfStudents = ...; Student[] students = new Student[noOfStudents]; for (int i = 0; i < noOfStudents; ++i) { students[i] = readStudent(); } return students; } Student readStudent() { int numberOfCourses = ...; String name = ...; String id = ...; Course[] courses = new Course[numberOfCourses] for (int i = 0; i < numberOfCourses; ++i) { courses[i] = readCourse(); } return new Student(id, name, courses); }