📜  如何使用Java的记事本以 CSV 格式读取写入对象的数据?

📅  最后修改于: 2022-05-13 01:55:33.872000             🧑  作者: Mango

如何使用Java的记事本以 CSV 格式读取写入对象的数据?

CSV 代表逗号分隔值。 CSV 文件可用于几乎所有电子表格程序,例如 Microsoft Excel 或 Google 电子表格。它们与其他电子表格文件类型不同,因为一个文件中只能有一个工作表,它们不能保存单元格、列或行。此外,您不能以这种格式保存公式。

现在,要以固定格式存储或写入对象的数据成员值意味着文件中固定长度的记录,我们可以使用 FileWriter、BufferedWriter 和String.format()的组合,其中String.format() 。 format()方法根据给定的语言环境、格式和参数返回格式化的字符串。 Java 字符串 format() 方法使用给定的语言环境、指定的格式字符串和参数返回格式化的字符串。 我们可以使用这种方法连接字符串,同时,我们可以格式化输出的连接字符串。

方法:

A.文件读取

  1. 使用 FileReader 和 BufferedReader 打开文件(使用文件完全限定名称)。
  2. 使用split()方法来拆分在逗号读出的数据-分离格式。
  3. 读取单个拆分值。
  4. 打印值。
  5. 关闭两个阅读器。

B.文件写入



  1. 创建任何类 Object 并为其数据成员赋值。
  2. 使用 FileWriter 和 BufferedWriter 在追加模式下创建和打开文件(使用文件的完全限定名称)。
  3. 使用 String.format() 方法创建一个固定格式的字符串,其中包含要写入的对象的数据成员的值。 (格式应包含“,”以将字符串存储为 CSV 格式)
  4. 使用 BufferedWriter 类的 write() 方法将格式化的字符串写入文件。
  5. 关闭两个作家。

实现:这里我们考虑一个 Customer 类,它有 2 个数据成员,即“name”和“account_No”。在读取时,我们需要读取以 CSV 格式写入文件中的数据并拆分读取的数据。在编写时,我们需要将 Customer 类型(以 CSV 格式)的每个对象的每个数据成员值保存名为“CustomerData.txt”的文件中。我们正在创建一个字符串格式,其中包含 30 个字节的客户名称文件和 10 个字节的客户 account_No(以使用 String 类的 format() 方法相同格式保存每个对象的数据成员)。例如:

String.format("%30s ,%10d",name, acc_No);

例子:

Java
// Java Program to Read Write Object's Data in CSV Format
// of FIxed Length Records using Notepad
 
// Importing input output classes
import java.io.*;
// Importing Scanner class to take input from user
import java.util.Scanner;
 
// Class 1
// Helper class
class Customer {
 
    // Member variables
    private String name = null;
    private long account_No;
    private static long auto_Generate_AccNo = 100;
 
    // Constructor of this class
    Customer(String nm)
    {
        account_No = auto_Generate_AccNo;
        auto_Generate_AccNo++;
        name = nm;
    }
 
    // Methods of this class
    public String getCustomerName() { return name; }
    public long getAccNo() { return account_No; }
}
 
// Class 2
// Main Class
public class Main {
 
    // Main driver method
    public static void main(String[] args)
    {
        // Custom input character
        char ch = 'y';
        int menuCh = 0;
        int exitStatus = 0;
 
        // Display commands
        System.out.println("Menu");
        System.out.println("1. For Creating New Customer ");
        System.out.println(" And saving it to the file");
        System.out.println("2. For Viewing File");
        System.out.println("3. For Exitn\n");
 
        // Checking to erupt case sensativity of input
        // character
        while (ch == 'y' || ch == 'Y') {
            // Asking user to enter the choice
            System.out.println("Enter Your Choice");
 
            // Scanner class object to take users choice
            Scanner sc = new Scanner(System.in);
 
            menuCh = sc.nextInt();
 
            // Switch case
            switch (menuCh) {
            case 1:
                createNewCustomerAndSave();
 
                // Break statement will immediately hault
                // further execution
                break;
            case 2:
                viewFile();
                break;
            case 3:
                exitStatus = 1;
                break;
 
            // Case if above all cases do not hit
            default:
                System.out.println("Wrong Choice");
                break;
            }
 
            // Checking exit status
            if (exitStatus == 1) {
                break;
            }
 
            // Asking from user
            System.out.println("Wanna Work More??? Yes/No");
 
            // skip /n ie newline
            ch = sc.next().charAt(0);
            ;
        }
    }
 
    // Method
    // To view the file
    public static void viewFile()
    {
 
        // Try block to check for exceptions
        try {
            System.out.println("Customers are : ");
 
            // Creating object of File class to get file
            // path
            File myObj = new File("CustomerData.txt");
 
            myObj.createNewFile();
 
            if (myObj.length() != 0) {
                Scanner myReader = new Scanner(myObj);
                myReader.useDelimiter(",");
 
                while (myReader.hasNextLine()) {
                    String str = myReader.nextLine();
 
                    // trim spaces
                    str = str.replaceAll("\\s", "");
                    String[] splitString = str.split(",");
                    String name = splitString[0];
                    long acc_No
                        = Long.valueOf(splitString[1]);
                    System.out.print("Name : " + name);
                    System.out.println(
                        " And account no is : " + acc_No);
                }
                myReader.close();
            }
        }
 
        // Catch block to handle the exceptions
        catch (Exception e) {
            System.out.println("An error occurred." + e);
            e.printStackTrace();
        }
    }
 
    // Method
    public static void createNewCustomerAndSave()
    {
        String name = null;
        String date = null;
 
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter Customer's Name");
        name = sc.nextLine();
        Customer c1 = new Customer(name);
        String dataToBeWriiten = null;
        try {
            File myObj = new File("CustomerData.txt");
            myObj.createNewFile();
            FileWriter myWriter1 = null;
            myWriter1
                = new FileWriter("CustomerData.txt", true);
            BufferedWriter myWriter
                = new BufferedWriter(myWriter1);
            long AccNo = c1.getAccNo();
            dataToBeWriiten
                = String.format("%30s ,%10d", name, AccNo);
            myWriter.write(dataToBeWriiten);
 
            myWriter.write(
                System.lineSeparator()); // to insert a new
                                         // line in file
            myWriter.close();
            System.out.println(
                "Successfully wrote to the file.\n");
        }
        catch (IOException e) {
            System.out.println("An error occurred.");
            e.printStackTrace();
        }
    }
}



输出:得到两种不同的输出

  • 输出 1:当我们第一次运行时
  • 输出 2:: 第一次后再次运行程序时



输出 1:当我们第一次运行时

Menu
1. For Creating New Customer and saving it to the file
2. For Viewing File
3. For Exitn

Enter Your Choice
1
Enter Customer's Name
Ramesh
Successfully wrote to the file.

Wanna Work More??? Yes/No
Y
Enter Your Choice
1
Enter Customer's Name
Rohan
Successfully wrote to the file.

Wanna Work More??? Yes/No
y
Enter Your Choice
2
Customers are : 
Name : Ramesh And account no is : 100
Name : Rohan And account no is : 101
Wanna Work More??? Yes/No
N

此外,执行后,“CustomerData.txt”被创建,它包含以下内容:

Ramesh ,       100
Rohan ,       101

解释:

正如您所看到的,上面为名称保留了 30 个字节(例如:24 个空格和 6 个字节用于 Ramesh)和 10 个字节为每行写入的帐户编号,因为我们使用 String.format() 这样做。



当您将这些行作为字符串一一读取时,该字符串也将包含空格,为了删除空格,我们使用了replaceAll()方法来获得一个没有空格的新字符串。

Eg: First line when read, str = " Ramesh, 100"

当我们使用 replaceAll() 时,str 变成

str = “Ramesh,100”

字符串没有空格现在有逗号分隔的值。为了单独获取这些值,我们使用了 split() 方法并获取了各个值并打印了它们。

Eg : After splitting the str according to ","  in our example we will had:

splitString[0] = Ramesh & splitString[1] = 100

因此,输出是根据这些拆分值打印的

输出 2:当程序在第一次后再次运行时

Menu
1. For Creating New Customer 
And saving it to the file
2. For Viewing File
3. For Exitn

Enter Your Choice
1
Enter Customer's Name
Chetan
Successfully wrote to the file.

Wanna Work More??? Yes/No
y
Enter Your Choice
2
Customers are : 
Name : Ramesh And account no is : 100
Name : Rohan And account no is : 101
Name : Chetan And account no is : 100
Wanna Work More??? Yes/No
N

输出说明:

现在,在第二次执行之前,您已经拥有包含 2 行数据的文件“CustomerData.txt”'。

Ramesh ,       100
Rohan ,       101

当您以追加模式写入数据时,新数据会在文件中已有的数据之后写入。因此文件“CustomerData.txt”将如下所示:

Ramesh ,       100
Rohan ,       101
Chetan ,       100

然后以与之前相同的方式读取文件,并以相同的方式读取文件的所有内容,逐行读取文件,删除空格并完成拆分,最后打印拆分数据。