如何从 Java 中的 .dat 文件中读取一行然后需要将其分开?
How do I read in a line from a .dat file in Java that then needs to be separated?
我正尝试在 TextPad 中使用 Java 读取 .dat 文件。 .dat 文件有多行代码,但每一行都有单独的信息片段,我需要这些信息用于我的主要方法和对象 类 中的不同方法。如何分离文件中提供的信息并将分离的部分输入到我的任何 类?
我知道如何从 .txt 文件读取基本输入,但它不适用于 .dat 文件。我不知道如何分隔没有逗号的数据,而且我不允许更改.dat文件中的数据。
在 TextPad 中查看 .dat 文件时,它显示为标准字符,而不是二进制字符。我正在尝试阅读的代码如下:
1001Intro. to CompSci 4ALBERT, PETER A. Comp Info System A
1001Intro. to CompSci 4ALLENSON, SHEILA M. Comp Info System B
1001Intro. to CompSci 4ANDERSON, ALENE T. Comp Info System A
1001Intro. to CompSci 4HENDRIX, JAMES D. Lib Arts - MIS C
1001Intro. to CompSci 4CANNON, FREDDY B.B. Comp Info System B
1002Visual Basic 3ALBERT, PETER A. Comp Info System C
1002Visual Basic 3ALLENSON, SHEILA M. Comp Info System D
1002Visual Basic 3ANDERSON, ALENE T. Comp Info System A
1002Visual Basic 3HENDRIX, JAMES D. Lib Arts - MIS B
1002Visual Basic 3CANNON, FREDDY B.B. Comp Info System B
1003Cisco Networking I 4ALBERT, PETER A. Comp Info System C
1003Cisco Networking I 4ALLENSON, SHEILA M. Comp Info System A
1003Cisco Networking I 4ANDERSON, ALENE T. Comp Info System A
1003Cisco Networking I 4HENDRIX, JAMES D. Lib Arts - MIS D
1004Cisco Networking III3ALBERT, PETER A. Comp Info System B
1004Cisco Networking III3ALLENSON, SHEILA M. Comp Info System C
1004Cisco Networking III3ANDERSON, ALENE T. Comp Info System A
1004Cisco Networking III3CANNON, FREDDY B.B. Comp Info System B
1004Cisco Networking III3HELLER, HELEN H. Lib Arts - MIS A
1004Cisco Networking III3HENDRIX, JAMES D. Lib Arts - MIS F
下面以上面的第 1 行为例,对各个信息进行了标记:
CourseID CourseName Credits StudentName Major Grade
1001简介。 CompSci 4ALBERT, PETER A. Comp Info System A
File file = new File("xyz.dat");
Scanner scnr = new Scanner(file);
while(scnr.hasNextLine()){
String line = scnr.nextLine();
System.out.println(line);
}
没有简单的方法可以做到这一点,因为没有用于分隔字符串的定界符。尝试破解,比如如果数据以数字开头,那么它就是一个课程 ID,如果两个单词之间有一个逗号,那么它就是一个名字等等......
注意:这个答案假设每一列都是确定的长度(4位课程ID,20个字符的课程名称,1位学分,20个字符的学生姓名, 20字专业, 1位数成绩)
首先,您需要获取文件中每一行的列表。
String[] lines = Files.readAllLines(new File("myfile.dat").toPath()).toArray(new String[0]);
接下来,使用substring()
方法处理每一行:
for(String line: lines) {
int courseId = Integer.parseInt(line.substring(0, 4));
String studentName = line.substring(4, 24).trim();
// etc...
}
trim()
函数删除尾随空格。
我知道这个 post 已经有一个可接受的答案,但我只是想解决 OP 在他的评论中提出的一些其他问题。
下面我提供了 运行可用代码,演示了如何从多固定字段长度数据文件中检索数据。该代码基于@kittycat3141 提供的内容,因为这是处理这种特殊情况的方法(在我看来)。
Chris 在您的评论中记下了如何查找和检索数据,不仅针对所有学生,还针对特定学生。我在下面提供的代码示例就是通过使用 String.contains() 方法来实现的。通过使用此方法,我们可以使用完整的学生姓名或仅使用学生姓名的一部分。在进行学生搜索时,字母大小写也会被忽略,因为对于某些数据文件,大小写可能是驼峰式而不是全部大写,这在您的特定数据文件中似乎是这种情况。
运行nable class 利用 Scanner 对象从控制台收集用户输入的信息,涉及:数据文件的路径和文件名,显示所有学生,或特定学生的数据.如果未提供任何内容,则代码 运行-time 终止。输入在一个循环中,以便可以进行多个学生查询。
编写的代码易于理解。当您 运行 代码查看输出控制台并回答显示的提示时。这是代码。我希望有人觉得这有点用处:
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.Scanner;
import javax.swing.JOptionPane;
public class ReadDatFile {
private static String[] dataLines;
public static void main(String[] args) {
Scanner userInput = new Scanner(System.in);
String studentName = "";
System.out.println("Please enter the path and file name to data file:");
String filePath = userInput.nextLine();
if ("".equals(filePath)) { System.exit(0); }
fillDataArray(filePath);
do {
System.out.println("\nEnter 'ALL' to display all Student data or\n"
+ "enter a Student name to return data for.\n"
+ "(To exit enter nothing): -> ");
studentName = userInput.nextLine();
if ("".equals(studentName)) { System.exit(0); }
if ("all".equals(studentName.toLowerCase())) {
displayAllStudents();
}
else {
displayStudent(studentName);
}
} while (!"".equals(studentName));
}
private static void fillDataArray(String fileName) {
try {
dataLines = Files.readAllLines(new File(fileName).toPath()).toArray(new String[0]);
} catch (IOException ex) {
JOptionPane.showMessageDialog (null, "Error Accessing The Data File "
+ "Indicated Below!\n\n" + fileName + "\n\n" + ex.getMessage(),
"FillDataArray() Method Error", JOptionPane.ERROR_MESSAGE);
System.exit(0);
}
}
private static void displayAllStudents() {
System.out.println("************** ALL STUDENTS ***************");
for (int i = 0; i < dataLines.length; i++) {
String courseID = dataLines[i].substring(0, 4).trim();
String courseName = dataLines[i].substring(4, 24).trim();
String courseCredit = dataLines[i].substring(24, 25).trim();
String studName = dataLines[i].substring(25, 45).trim();
String studMajor = dataLines[i].substring(45, 65).trim();
String studGrade = dataLines[i].substring(65, 66).trim();
System.out.println("Student Name : " + studName);
System.out.println("Course ID : " + courseID);
System.out.println("Course Name : " + courseName);
System.out.println("Course Credit: " + courseCredit);
System.out.println("Student Major: " + studMajor);
System.out.println("Student Grade: " + studGrade);
System.out.println("---------------------------------------------");
}
System.out.println("*********** END OF STUDENT DATA ***********");
}
private static void displayStudent(String studentName) {
System.out.println("********* COURSE DATA FOR " + studentName + " *********");
ArrayList<String> student = new ArrayList<>();
for (int i = 0; i < dataLines.length; i++) {
String studName = dataLines[i].substring(25, 45).trim().toLowerCase();
if (studName.contains(studentName.toLowerCase())) {
student.add(dataLines[i]);
}
}
for (int i = 0; i < student.size(); i++) {
String courseID = student.get(i).substring(0, 4).trim();
String courseName = student.get(i).substring(4, 24).trim();
String courseCredit = student.get(i).substring(24, 25).trim();
String studName = student.get(i).substring(25, 45).trim();
String studMajor = student.get(i).substring(45, 65).trim();
String studGrade = student.get(i).substring(65, 66).trim();
System.out.println("Student Name : " + studName);
System.out.println("Course ID : " + courseID);
System.out.println("Course Name : " + courseName);
System.out.println("Course Credit: " + courseCredit);
System.out.println("Student Major: " + studMajor);
System.out.println("Student Grade: " + studGrade);
System.out.println("---------------------------------------------");
}
System.out.println("*********** END OF STUDENT DATA ***********");
}
}
我正尝试在 TextPad 中使用 Java 读取 .dat 文件。 .dat 文件有多行代码,但每一行都有单独的信息片段,我需要这些信息用于我的主要方法和对象 类 中的不同方法。如何分离文件中提供的信息并将分离的部分输入到我的任何 类?
我知道如何从 .txt 文件读取基本输入,但它不适用于 .dat 文件。我不知道如何分隔没有逗号的数据,而且我不允许更改.dat文件中的数据。
在 TextPad 中查看 .dat 文件时,它显示为标准字符,而不是二进制字符。我正在尝试阅读的代码如下:
1001Intro. to CompSci 4ALBERT, PETER A. Comp Info System A
1001Intro. to CompSci 4ALLENSON, SHEILA M. Comp Info System B
1001Intro. to CompSci 4ANDERSON, ALENE T. Comp Info System A
1001Intro. to CompSci 4HENDRIX, JAMES D. Lib Arts - MIS C
1001Intro. to CompSci 4CANNON, FREDDY B.B. Comp Info System B
1002Visual Basic 3ALBERT, PETER A. Comp Info System C
1002Visual Basic 3ALLENSON, SHEILA M. Comp Info System D
1002Visual Basic 3ANDERSON, ALENE T. Comp Info System A
1002Visual Basic 3HENDRIX, JAMES D. Lib Arts - MIS B
1002Visual Basic 3CANNON, FREDDY B.B. Comp Info System B
1003Cisco Networking I 4ALBERT, PETER A. Comp Info System C
1003Cisco Networking I 4ALLENSON, SHEILA M. Comp Info System A
1003Cisco Networking I 4ANDERSON, ALENE T. Comp Info System A
1003Cisco Networking I 4HENDRIX, JAMES D. Lib Arts - MIS D
1004Cisco Networking III3ALBERT, PETER A. Comp Info System B
1004Cisco Networking III3ALLENSON, SHEILA M. Comp Info System C
1004Cisco Networking III3ANDERSON, ALENE T. Comp Info System A
1004Cisco Networking III3CANNON, FREDDY B.B. Comp Info System B
1004Cisco Networking III3HELLER, HELEN H. Lib Arts - MIS A
1004Cisco Networking III3HENDRIX, JAMES D. Lib Arts - MIS F
下面以上面的第 1 行为例,对各个信息进行了标记:
CourseID CourseName Credits StudentName Major Grade
1001简介。 CompSci 4ALBERT, PETER A. Comp Info System A
File file = new File("xyz.dat");
Scanner scnr = new Scanner(file);
while(scnr.hasNextLine()){
String line = scnr.nextLine();
System.out.println(line);
}
没有简单的方法可以做到这一点,因为没有用于分隔字符串的定界符。尝试破解,比如如果数据以数字开头,那么它就是一个课程 ID,如果两个单词之间有一个逗号,那么它就是一个名字等等......
注意:这个答案假设每一列都是确定的长度(4位课程ID,20个字符的课程名称,1位学分,20个字符的学生姓名, 20字专业, 1位数成绩)
首先,您需要获取文件中每一行的列表。
String[] lines = Files.readAllLines(new File("myfile.dat").toPath()).toArray(new String[0]);
接下来,使用substring()
方法处理每一行:
for(String line: lines) {
int courseId = Integer.parseInt(line.substring(0, 4));
String studentName = line.substring(4, 24).trim();
// etc...
}
trim()
函数删除尾随空格。
我知道这个 post 已经有一个可接受的答案,但我只是想解决 OP 在他的评论中提出的一些其他问题。
下面我提供了 运行可用代码,演示了如何从多固定字段长度数据文件中检索数据。该代码基于@kittycat3141 提供的内容,因为这是处理这种特殊情况的方法(在我看来)。
Chris 在您的评论中记下了如何查找和检索数据,不仅针对所有学生,还针对特定学生。我在下面提供的代码示例就是通过使用 String.contains() 方法来实现的。通过使用此方法,我们可以使用完整的学生姓名或仅使用学生姓名的一部分。在进行学生搜索时,字母大小写也会被忽略,因为对于某些数据文件,大小写可能是驼峰式而不是全部大写,这在您的特定数据文件中似乎是这种情况。
运行nable class 利用 Scanner 对象从控制台收集用户输入的信息,涉及:数据文件的路径和文件名,显示所有学生,或特定学生的数据.如果未提供任何内容,则代码 运行-time 终止。输入在一个循环中,以便可以进行多个学生查询。
编写的代码易于理解。当您 运行 代码查看输出控制台并回答显示的提示时。这是代码。我希望有人觉得这有点用处:
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.Scanner;
import javax.swing.JOptionPane;
public class ReadDatFile {
private static String[] dataLines;
public static void main(String[] args) {
Scanner userInput = new Scanner(System.in);
String studentName = "";
System.out.println("Please enter the path and file name to data file:");
String filePath = userInput.nextLine();
if ("".equals(filePath)) { System.exit(0); }
fillDataArray(filePath);
do {
System.out.println("\nEnter 'ALL' to display all Student data or\n"
+ "enter a Student name to return data for.\n"
+ "(To exit enter nothing): -> ");
studentName = userInput.nextLine();
if ("".equals(studentName)) { System.exit(0); }
if ("all".equals(studentName.toLowerCase())) {
displayAllStudents();
}
else {
displayStudent(studentName);
}
} while (!"".equals(studentName));
}
private static void fillDataArray(String fileName) {
try {
dataLines = Files.readAllLines(new File(fileName).toPath()).toArray(new String[0]);
} catch (IOException ex) {
JOptionPane.showMessageDialog (null, "Error Accessing The Data File "
+ "Indicated Below!\n\n" + fileName + "\n\n" + ex.getMessage(),
"FillDataArray() Method Error", JOptionPane.ERROR_MESSAGE);
System.exit(0);
}
}
private static void displayAllStudents() {
System.out.println("************** ALL STUDENTS ***************");
for (int i = 0; i < dataLines.length; i++) {
String courseID = dataLines[i].substring(0, 4).trim();
String courseName = dataLines[i].substring(4, 24).trim();
String courseCredit = dataLines[i].substring(24, 25).trim();
String studName = dataLines[i].substring(25, 45).trim();
String studMajor = dataLines[i].substring(45, 65).trim();
String studGrade = dataLines[i].substring(65, 66).trim();
System.out.println("Student Name : " + studName);
System.out.println("Course ID : " + courseID);
System.out.println("Course Name : " + courseName);
System.out.println("Course Credit: " + courseCredit);
System.out.println("Student Major: " + studMajor);
System.out.println("Student Grade: " + studGrade);
System.out.println("---------------------------------------------");
}
System.out.println("*********** END OF STUDENT DATA ***********");
}
private static void displayStudent(String studentName) {
System.out.println("********* COURSE DATA FOR " + studentName + " *********");
ArrayList<String> student = new ArrayList<>();
for (int i = 0; i < dataLines.length; i++) {
String studName = dataLines[i].substring(25, 45).trim().toLowerCase();
if (studName.contains(studentName.toLowerCase())) {
student.add(dataLines[i]);
}
}
for (int i = 0; i < student.size(); i++) {
String courseID = student.get(i).substring(0, 4).trim();
String courseName = student.get(i).substring(4, 24).trim();
String courseCredit = student.get(i).substring(24, 25).trim();
String studName = student.get(i).substring(25, 45).trim();
String studMajor = student.get(i).substring(45, 65).trim();
String studGrade = student.get(i).substring(65, 66).trim();
System.out.println("Student Name : " + studName);
System.out.println("Course ID : " + courseID);
System.out.println("Course Name : " + courseName);
System.out.println("Course Credit: " + courseCredit);
System.out.println("Student Major: " + studMajor);
System.out.println("Student Grade: " + studGrade);
System.out.println("---------------------------------------------");
}
System.out.println("*********** END OF STUDENT DATA ***********");
}
}