使用 Java 向 CSV 文件写入数据

JavaJavaBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在这个实验中,你将学习如何使用 Java 把数据写入 CSV(逗号分隔值)文件。CSV 文件是存储表格数据的常用格式,广泛用于不同应用程序之间的数据交换。

你将使用 OpenCSV 库,它提供了在 Java 中读写 CSV 文件的简单方法。在这个实验结束时,你将创建一个 Java 程序,该程序可以将数据写入新的 CSV 文件,并将额外的数据追加到现有文件中。

理解 CSV 文件并搭建项目

CSV(逗号分隔值)是一种用于存储表格数据的简单文件格式。CSV 文件中的每一行代表一行数据,行内的值用逗号分隔。例如,一个包含学生数据的 CSV 文件可能如下所示:

Name,Age,Email
John Doe,25,[email protected]
Jane Smith,22,[email protected]

让我们从创建一个简单的 Maven 项目开始来处理 CSV 文件。Maven 是一个构建自动化工具,它将帮助我们管理项目的依赖项。

  1. 首先,在 WebIDE 中打开终端并导航到项目目录:
cd ~/project/csv-writer
  1. 在项目目录中创建一个名为 pom.xml 的新文件。这个文件将定义我们的项目结构和依赖项:
touch pom.xml
  1. 在 WebIDE 编辑器中打开 pom.xml 文件,并添加以下内容:
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>csv-writer</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.opencsv</groupId>
            <artifactId>opencsv</artifactId>
            <version>5.4</version>
        </dependency>
    </dependencies>
</project>

这个 XML 文件定义了我们的项目,并将 OpenCSV 库(版本 5.4)作为依赖项添加。OpenCSV 提供了用于读写 CSV 文件的简单类。

  1. 为我们的 Java 源代码创建目录结构:
mkdir -p src/main/java/com/example

这个命令为 Java 源代码创建了标准的 Maven 目录结构。

创建一个简单的 CSV 写入器程序

现在我们已经使用 OpenCSV 依赖项搭建好了项目,接下来可以创建一个将数据写入 CSV 文件的 Java 程序。

  1. 在我们之前创建的目录结构中创建一个名为 CSVWriterExample.java 的新 Java 类文件:
touch src/main/java/com/example/CSVWriterExample.java
  1. 在 WebIDE 编辑器中打开 CSVWriterExample.java 并添加以下代码:
package com.example;

import com.opencsv.CSVWriter;
import java.io.FileWriter;
import java.io.IOException;

public class CSVWriterExample {
    public static void main(String[] args) {
        try {
            // Create a new CSVWriter instance
            // The first parameter is a FileWriter with the file path
            // The second parameter is the separator character (default is comma)
            // The third parameter is the quote character (default is double quote)
            // The fourth parameter is the escape character (default is backslash)
            // The fifth parameter is the line ending (default is newline)
            CSVWriter writer = new CSVWriter(new FileWriter("students.csv"),
                                           CSVWriter.DEFAULT_SEPARATOR,
                                           CSVWriter.DEFAULT_QUOTE_CHARACTER,
                                           CSVWriter.DEFAULT_ESCAPE_CHARACTER,
                                           CSVWriter.DEFAULT_LINE_END);

            // Write header line
            String[] header = {"Name", "Age", "Email"};
            writer.writeNext(header);

            // Write data lines
            String[] student1 = {"John Doe", "25", "[email protected]"};
            writer.writeNext(student1);

            String[] student2 = {"Jane Smith", "22", "[email protected]"};
            writer.writeNext(student2);

            // Close the writer to flush and release resources
            writer.close();

            System.out.println("CSV file created successfully!");

        } catch (IOException e) {
            System.out.println("Error writing to CSV file: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

这段代码实现了以下功能:

  • 从 OpenCSV 库和 Java I/O 包中导入必要的类
  • 创建一个 CSVWriter 对象,该对象将数据写入名为 students.csv 的文件
  • 写入包含字段名的标题行
  • 写入两行学生数据
  • 关闭写入器,确保所有数据都被刷新到文件中

CSVWriter 构造函数有五个参数:

  • FileWriter:指定要写入的文件
  • 分隔符:用于分隔字段的字符(默认为逗号)
  • 引号字符:用于引用字段的字符(默认为双引号)
  • 转义字符:用于转义特殊字符的字符(默认为反斜杠)
  • 行结束符:用于结束行的字符(默认为换行符)
  1. 使用 Maven 编译 Java 程序:
cd ~/project/csv-writer
mvn compile

此命令使用 Maven 构建系统编译我们的 Java 源代码。

运行 CSV 写入器程序

让我们运行 Java 程序来创建 CSV 文件并查看结果。

  1. 使用 Maven 执行已编译的 Java 程序:
cd ~/project/csv-writer
mvn exec:java -Dexec.mainClass="com.example.CSVWriterExample"

如果你看到关于 exec-maven-plugin 的错误消息,我们需要将其添加到 pom.xml 中:

  1. 在 WebIDE 编辑器中打开 pom.xml 并更新它,以包含 exec-maven-plugin
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>csv-writer</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.opencsv</groupId>
            <artifactId>opencsv</artifactId>
            <version>5.4</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>3.0.0</version>
                <configuration>
                    <mainClass>com.example.CSVWriterExample</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
  1. 现在再次运行程序:
mvn exec:java

你应该会在终端输出中看到消息“CSV file created successfully!”。

  1. 让我们验证一下 CSV 文件是否已创建并包含预期的数据:
cat students.csv

输出应该显示 CSV 文件的内容,大致如下:

"Name","Age","Email"
"John Doe","25","[email protected]"
"Jane Smith","22","[email protected]"

注意,输出中每个字段周围都包含引号。这是 OpenCSV 的默认行为,有助于处理包含逗号等特殊字符的字段。

向现有 CSV 文件追加数据

既然我们已经创建了一个 CSV 文件,接下来让我们修改 Java 程序,以便向现有文件追加额外的数据,而不是覆盖它。

  1. 创建一个名为 CSVAppendExample.java 的新 Java 文件:
touch src/main/java/com/example/CSVAppendExample.java
  1. 在 WebIDE 编辑器中打开 CSVAppendExample.java 并添加以下代码:
package com.example;

import com.opencsv.CSVWriter;
import java.io.FileWriter;
import java.io.IOException;

public class CSVAppendExample {
    public static void main(String[] args) {
        try {
            // Create a CSVWriter in append mode by setting the second parameter of FileWriter to true
            CSVWriter writer = new CSVWriter(new FileWriter("students.csv", true));

            // Write additional data to the existing file
            String[] student3 = {"Robert Johnson", "24", "[email protected]"};
            writer.writeNext(student3);

            String[] student4 = {"Maria Garcia", "23", "[email protected]"};
            writer.writeNext(student4);

            // Close the writer
            writer.close();

            System.out.println("Data appended to CSV file successfully!");

        } catch (IOException e) {
            System.out.println("Error appending to CSV file: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

这段代码与我们之前的示例类似,但有两个重要的区别:

  • 我们在创建 FileWriter 时将第二个参数设置为 true,这会使其处于追加模式
  • 我们没有写入标题行,因为文件中已经有了
  1. 运行程序,向现有的 CSV 文件追加数据:
cd ~/project/csv-writer
mvn exec:java -Dexec.mainClass="com.example.CSVAppendExample"
  1. 现在让我们检查一下 CSV 文件的内容:
cat students.csv

你应该会看到原始数据加上新追加的记录:

"Name","Age","Email"
"John Doe","25","[email protected]"
"Jane Smith","22","[email protected]"
"Robert Johnson","24","[email protected]"
"Maria Garcia","23","[email protected]"

如你所见,新数据被添加到了文件末尾,而没有影响到现有内容。

  1. 让我们再创建一个示例,展示如何使用自定义分隔符来写入 CSV 文件:
touch src/main/java/com/example/CSVCustomExample.java
  1. 在 WebIDE 编辑器中打开 CSVCustomExample.java 并添加以下代码:
package com.example;

import com.opencsv.CSVWriter;
import java.io.FileWriter;
import java.io.IOException;

public class CSVCustomExample {
    public static void main(String[] args) {
        try {
            // Create a CSVWriter with semicolon as separator instead of comma
            CSVWriter writer = new CSVWriter(new FileWriter("students_semicolon.csv"),
                                           ';',
                                           CSVWriter.DEFAULT_QUOTE_CHARACTER,
                                           CSVWriter.DEFAULT_ESCAPE_CHARACTER,
                                           CSVWriter.DEFAULT_LINE_END);

            // Write header line
            String[] header = {"Name", "Age", "Email"};
            writer.writeNext(header);

            // Write data lines
            String[] student1 = {"John Doe", "25", "[email protected]"};
            writer.writeNext(student1);

            String[] student2 = {"Jane Smith", "22", "[email protected]"};
            writer.writeNext(student2);

            // Close the writer
            writer.close();

            System.out.println("CSV file with semicolon separator created successfully!");

        } catch (IOException e) {
            System.out.println("Error writing to CSV file: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

这个示例创建了一个使用分号作为分隔符而非逗号的 CSV 文件,在一些欧洲国家,逗号被用作小数点分隔符,因此使用分号作为 CSV 文件的分隔符很常见。

  1. 运行自定义分隔符示例:
cd ~/project/csv-writer
mvn exec:java -Dexec.mainClass="com.example.CSVCustomExample"
  1. 检查新 CSV 文件的内容:
cat students_semicolon.csv

你应该会看到使用分号作为分隔符的 CSV 文件:

"Name";"Age";"Email"
"John Doe";"25";"[email protected]"
"Jane Smith";"22";"[email protected]"

总结

在这个实验中,你学习了如何使用 Java 和 OpenCSV 库将数据写入 CSV 文件。你成功地完成了以下操作:

  1. 搭建了一个包含 OpenCSV 依赖的 Java 项目
  2. 创建了一个基本的 Java 程序,用于将数据写入新的 CSV 文件
  3. 修改程序,使其能够向现有的 CSV 文件追加数据
  4. 创建了一个使用不同分隔符的自定义 CSV 写入器

这些技能在许多应用场景中都很有用,例如数据导出、报告生成以及系统间的数据交换。由于 CSV 格式简单,并且与电子表格软件和数据分析工具兼容,因此被广泛使用。

一些关键要点如下:

  • OpenCSV 中的 CSVWriter 类为在 Java 中写入 CSV 文件提供了一种简单的方法
  • 要创建新的 CSV 文件,可将 new FileWriter(filename)CSVWriter 配合使用
  • 要向现有的 CSV 文件追加数据,可将 new FileWriter(filename, true)CSVWriter 配合使用
  • 始终使用 writer.close() 关闭写入器,以确保所有数据都被写入文件
  • 你可以自定义 CSV 格式的分隔符、引号字符和其他方面

掌握了这些基础知识后,你应该能够将 CSV 写入功能集成到你的 Java 应用程序中。