介绍
在这个实验中,你将学习如何使用 Java 把数据写入 CSV(逗号分隔值)文件。CSV 文件是存储表格数据的常用格式,广泛用于不同应用程序之间的数据交换。
你将使用 OpenCSV 库,它提供了在 Java 中读写 CSV 文件的简单方法。在这个实验结束时,你将创建一个 Java 程序,该程序可以将数据写入新的 CSV 文件,并将额外的数据追加到现有文件中。
了解 CSV 文件并搭建项目
CSV(逗号分隔值)是一种用于存储表格数据的简单文件格式。CSV 文件中的每一行代表一行数据,行内的值用逗号分隔。例如,一个包含学生数据的 CSV 文件可能如下所示:
Name,Age,Email
John Doe,25,john.doe@example.com
Jane Smith,22,jane.smith@example.com
让我们从创建一个简单的 Maven 项目开始来处理 CSV 文件。Maven 是一个构建自动化工具,它将帮助我们管理项目的依赖项。
- 首先,在 WebIDE 中打开终端并导航到项目目录:
cd ~/project/csv-writer
- 在项目目录中创建一个名为
pom.xml的新文件。这个文件将定义我们的项目结构和依赖项:
touch pom.xml
- 在 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 文件的简单类。
- 为我们的 Java 源代码创建目录结构:
mkdir -p src/main/java/com/example
这个命令为 Java 源代码创建了标准的 Maven 目录结构。
创建一个简单的 CSV 写入器程序
现在我们已经使用 OpenCSV 依赖项搭建好了项目,接下来可以创建一个将数据写入 CSV 文件的 Java 程序。
- 在我们之前创建的目录结构中创建一个名为
CSVWriterExample.java的新 Java 类文件:
touch src/main/java/com/example/CSVWriterExample.java
- 在 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", "john.doe@example.com"};
writer.writeNext(student1);
String[] student2 = {"Jane Smith", "22", "jane.smith@example.com"};
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:指定要写入的文件- 分隔符:用于分隔字段的字符(默认为逗号)
- 引号字符:用于引用字段的字符(默认为双引号)
- 转义字符:用于转义特殊字符的字符(默认为反斜杠)
- 行结束符:用于结束行的字符(默认为换行符)
- 使用 Maven 编译 Java 程序:
cd ~/project/csv-writer
mvn compile
此命令使用 Maven 构建系统编译我们的 Java 源代码。
运行 CSV 写入器程序
让我们运行 Java 程序来创建 CSV 文件并查看结果。
- 使用 Maven 执行已编译的 Java 程序:
cd ~/project/csv-writer
mvn exec:java -Dexec.mainClass="com.example.CSVWriterExample"
如果你看到关于 exec-maven-plugin 的错误消息,我们需要将其添加到 pom.xml 中:
- 在 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>
- 现在再次运行程序:
mvn exec:java
你应该会在终端输出中看到消息“CSV file created successfully!”。
- 让我们验证一下 CSV 文件是否已创建并包含预期的数据:
cat students.csv
输出应该显示 CSV 文件的内容,大致如下:
"Name","Age","Email"
"John Doe","25","john.doe@example.com"
"Jane Smith","22","jane.smith@example.com"
注意,输出中每个字段周围都包含引号。这是 OpenCSV 的默认行为,有助于处理包含逗号等特殊字符的字段。
向现有 CSV 文件追加数据
既然我们已经创建了一个 CSV 文件,接下来让我们修改 Java 程序,以便向现有文件追加额外的数据,而不是覆盖它。
- 创建一个名为
CSVAppendExample.java的新 Java 文件:
touch src/main/java/com/example/CSVAppendExample.java
- 在 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", "robert.johnson@example.com"};
writer.writeNext(student3);
String[] student4 = {"Maria Garcia", "23", "maria.garcia@example.com"};
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,这会使其处于追加模式 - 我们没有写入标题行,因为文件中已经有了
- 运行程序,向现有的 CSV 文件追加数据:
cd ~/project/csv-writer
mvn exec:java -Dexec.mainClass="com.example.CSVAppendExample"
- 现在让我们检查一下 CSV 文件的内容:
cat students.csv
你应该会看到原始数据加上新追加的记录:
"Name","Age","Email"
"John Doe","25","john.doe@example.com"
"Jane Smith","22","jane.smith@example.com"
"Robert Johnson","24","robert.johnson@example.com"
"Maria Garcia","23","maria.garcia@example.com"
如你所见,新数据被添加到了文件末尾,而没有影响到现有内容。
- 让我们再创建一个示例,展示如何使用自定义分隔符来写入 CSV 文件:
touch src/main/java/com/example/CSVCustomExample.java
- 在 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", "john.doe@example.com"};
writer.writeNext(student1);
String[] student2 = {"Jane Smith", "22", "jane.smith@example.com"};
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 文件的分隔符很常见。
- 运行自定义分隔符示例:
cd ~/project/csv-writer
mvn exec:java -Dexec.mainClass="com.example.CSVCustomExample"
- 检查新 CSV 文件的内容:
cat students_semicolon.csv
你应该会看到使用分号作为分隔符的 CSV 文件:
"Name";"Age";"Email"
"John Doe";"25";"john.doe@example.com"
"Jane Smith";"22";"jane.smith@example.com"
总结
在这个实验中,你学习了如何使用 Java 和 OpenCSV 库将数据写入 CSV 文件。你成功地完成了以下操作:
- 搭建了一个包含 OpenCSV 依赖的 Java 项目
- 创建了一个基本的 Java 程序,用于将数据写入新的 CSV 文件
- 修改程序,使其能够向现有的 CSV 文件追加数据
- 创建了一个使用不同分隔符的自定义 CSV 写入器
这些技能在许多应用场景中都很有用,例如数据导出、报告生成以及系统间的数据交换。由于 CSV 格式简单,并且与电子表格软件和数据分析工具兼容,因此被广泛使用。
一些关键要点如下:
- OpenCSV 中的
CSVWriter类为在 Java 中写入 CSV 文件提供了一种简单的方法 - 要创建新的 CSV 文件,可将
new FileWriter(filename)与CSVWriter配合使用 - 要向现有的 CSV 文件追加数据,可将
new FileWriter(filename, true)与CSVWriter配合使用 - 始终使用
writer.close()关闭写入器,以确保所有数据都被写入文件 - 你可以自定义 CSV 格式的分隔符、引号字符和其他方面
掌握了这些基础知识后,你应该能够将 CSV 写入功能集成到你的 Java 应用程序中。



