【问题标题】:How do I read in a line from a .dat file in Java that then needs to be separated?如何从 Java 中的 .dat 文件中读取一行,然后需要将其分开?
【发布时间】:2016-03-19 10:45:39
【问题描述】:

我正在尝试在 TextPad 中使用 Java 读取 .dat 文件。 .dat 文件有多行代码,但每一行都有单独的信息,我需要这些信息用于我的主要方法和对象类中的不同方法。如何分隔文件中提供的信息并将单独的部分输入到我的任何类中?

我知道如何从 .t​​xt 文件读取基本输入,但它不适用于 .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 学分 StudentName Major Grade

1001简介。致 CompSci 4ALBERT, PETER A. Comp 信息系统 A

【问题讨论】:

  • 此外,我将在 Credits 部分以双精度阅读,其他所有内容都将作为字符串阅读。无论如何,这是计划,如果有人有更好的方法,我会这样做。
  • 课程名称是否总是被截断/填充空格,长度为 20 个字符?
  • 没有@kittycat3141。 4 个不同的课程名称中的每一个都需要按原样显示。
  • 虽然没有明确的分隔符将字段彼此分开,但似乎每个字段都包含特定的长度(CourseID = 4,CourseName = 20,Creadits = 1,StudentName = 10,Major = 20,最后等级 = 1)。基于此,您可以在从文件中读取每个文件行时轻松地拆开并修剪它。
  • 对不起....StudentName 是一个长度为 20 的字段。

标签: java file-io input io output


【解决方案1】:
File file = new File("xyz.dat");
Scanner scnr = new Scanner(file);
while(scnr.hasNextLine()){
   String line = scnr.nextLine();
   System.out.println(line);
}

没有简单的方法可以做到这一点,因为没有分隔符来分隔字符串。尝试一个 hack,比如如果数据以数字开头,那么它就是一个课程 ID,如果两个单词之间有一个逗号,它就是一个名字等等......

【讨论】:

  • 所以您可以像读取和导入 .txt 文件一样读取和导入 .dat 文件?很高兴知道。现在您知道如何在代码中分隔名为line 的字符串中的每个部分了吗?
【解决方案2】:

注意:此答案假定每列都是确定的长度(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() 函数删除尾随空格。

【讨论】:

  • 好的,谢谢。我不允许制作任何新文件,但我会尝试使用它,但只能逐行进行。有没有办法选择单独的行来阅读?例如,我想要学生 Albert 所在的所有课程(第 1、6、11、15 行),我只使用一种方法从这些行中读取信息,然后创建另一种方法来读取不同学生的行等?最终结果是所有学生及其信息的格式良好的屏幕输出。
  • 一旦文件包含在名为 'lines' 的字符串数组中,您就可以为所欲为。每个文件行将包含在数组的每个元素中。这意味着 lines[0] 将保存第一个文件行,lines[1] 将保存第二个文件行,依此类推...
【解决方案3】:

我意识到这篇文章已经有一个公认的答案,但我只是想解决 OP 在他的 cmets 中提出的一些其他问题。

下面我提供了可运行的代码,演示了如何从多个固定字段长度数据文件中检索数据。该代码基于@kittycat3141 提供的内容,因为这是处理这种特殊情况的方法(我诚实地认为)。

在您的 cmets Chris 中,您记录了如何定位和检索数据,不仅适用于所有学生,也适用于特定学生。我在下面提供的代码示例就是通过使用 String.contains() 方法来实现的。通过使用这种方法,我们既可以使用完整的学生姓名,也可以只使用学生姓名的一部分。在进行学生搜索时,字母大小写也会被忽略,因为对于某些数据文件,大小写可能是驼峰式,而不是所有大写字母,这在您的特定数据文件中似乎是这种情况。

可运行类利用 Scanner 对象从控制台用户输入收集有关以下方面的信息:数据文件的路径和文件名、显示所有学生或特定学生的数据。如果未提供任何内容,则代码运行时终止。输入处于循环中,因此可以进行多个学生查询。

代码的编写是为了易于理解。当您运行代码时,请查看输出控制台并回答显示的提示。这是代码。我希望有人觉得这有点用:

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  ***********");
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多