CSV 文件处理工具 - CsvUtil
# CSV 文件处理工具 - CsvUtil
简介
CsvUtil
是 Hutool 提供的用于处理 CSV 文件的工具类。CSV(Comma-Separated Values)是一种常见的纯文本格式,用于存储表格数据。Hutool 的 CsvUtil
提供了对 CSV 文件的读写支持,参考了 FastCSV 项目但独立实现,不依赖第三方库。
CsvUtil
工具类封装了两个核心方法:
getReader
:用于读取 CSV 文件。getWriter
:用于生成 CSV 文件。
这两个方法分别获取 CsvReader
对象和 CsvWriter
对象,用于独立完成 CSV 文件的读写操作。
# 1. 使用场景
- 数据导入导出:在企业应用中,经常需要从 CSV 文件中导入数据或将数据导出为 CSV 格式,便于与其他系统进行数据交换。
- 表格处理:在需要以表格形式处理和展示数据时,CSV 是一种非常简单而通用的格式。
- 配置管理:有时会使用 CSV 文件存储简单的配置信息,方便维护和更新。
# 2. 主要方法
# 2.1 读取 CSV 文件
CsvUtil
提供了多种方式读取 CSV 文件,包括读取为 CsvRow
对象列表、读取为 Java Bean 列表等。
# 示例:读取 CSV 文件为 CsvRow
列表
import cn.hutool.core.text.csv.CsvData;
import cn.hutool.core.text.csv.CsvReader;
import cn.hutool.core.text.csv.CsvRow;
import cn.hutool.core.util.CsvUtil;
import cn.hutool.core.io.FileUtil;
import java.util.List;
public class CsvUtilExample {
public static void main(String[] args) {
// 创建 CsvReader 对象
CsvReader reader = CsvUtil.getReader();
// 从文件中读取 CSV 数据
CsvData data = reader.read(FileUtil.file("test.csv"));
List<CsvRow> rows = data.getRows();
// 遍历行数据
for (CsvRow csvRow : rows) {
// getRawList 返回一个 List 列表,列表的每一项为 CSV 中的一个单元格
System.out.println(csvRow.getRawList());
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
- 方法签名:
CsvReader getReader()
:获取一个用于读取 CSV 文件的CsvReader
对象。CsvData read(File file)
:读取 CSV 文件并返回CsvData
,可以获取所有行的数据。
- 参数说明:
file
: 需要读取的 CSV 文件。
- 返回值:
CsvData
,其中包含多个CsvRow
对象,表示 CSV 文件中的每一行数据。 - 作用:将 CSV 文件的内容解析为行数据,适用于需要逐行处理 CSV 数据的场景。
- 实际开发场景:在导入数据时,经常需要解析 CSV 文件,读取每一行的数据并进行处理。
# 示例:读取 CSV 文件为 Java Bean 列表
import cn.hutool.core.text.csv.CsvReader;
import cn.hutool.core.util.CsvUtil;
import cn.hutool.core.util.ResourceUtil;
import cn.hutool.core.annotation.Alias;
import lombok.Data;
import java.util.List;
public class CsvUtilExample {
public static void main(String[] args) {
// 创建 CsvReader 对象
CsvReader reader = CsvUtil.getReader();
// 读取 CSV 文件为 Java Bean 列表
List<TestBean> result = reader.read(
ResourceUtil.getUtf8Reader("test_bean.csv"), TestBean.class);
// 输出结果
result.forEach(System.out::println);
}
@Data
private static class TestBean {
@Alias("姓名")
private String name;
private String gender;
private String focus;
private Integer age;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
- 方法签名:
List<T> read(Reader reader, Class<T> beanType)
:读取 CSV 文件为指定类型的 Java Bean 列表。
- 参数说明:
reader
: 输入流,通常为文件或资源的 Reader。beanType
: 目标 Java Bean 的类型。
- 返回值:
List<T>
,解析后的 Java Bean 列表。 - 作用:将 CSV 文件的每一行数据映射为 Java 对象,适用于需要将 CSV 数据转换为业务对象的场景。
- 实际开发场景:在导入数据时,经常需要将 CSV 数据映射为 Java 对象进行进一步处理。
# 2.2 生成 CSV 文件
CsvUtil
提供了 getWriter
方法用于生成 CSV 文件,并支持按行写入数据。
# 示例:生成 CSV 文件
import cn.hutool.core.text.csv.CsvWriter;
import cn.hutool.core.util.CsvUtil;
import cn.hutool.core.util.CharsetUtil;
public class CsvUtilExample {
public static void main(String[] args) {
// 创建 CsvWriter 对象,指定文件路径和编码
CsvWriter writer = CsvUtil.getWriter("e:/testWrite.csv", CharsetUtil.CHARSET_UTF_8);
// 按行写入数据
writer.write(
new String[] {"a1", "b1", "c1"},
new String[] {"a2", "b2", "c2"},
new String[] {"a3", "b3", "c3"}
);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
- 方法签名:
CsvWriter getWriter(String path, Charset charset)
:获取一个用于写入 CSV 文件的CsvWriter
对象。void write(String[]... lines)
:按行写入数据。
- 参数说明:
path
: 生成的 CSV 文件路径。charset
: 文件的字符编码。lines
: 需要写入的行数据,每一行是一个字符串数组。
- 返回值:无。
- 作用:按行写出 CSV 文件,适用于需要导出数据为 CSV 格式的场景。
- 实际开发场景:在导出数据时,可以将数据写入 CSV 文件供其他系统或用户使用。
# 3. 常见问题与解决方案
# 3.1 乱码问题
当使用 Excel 打开 CSV 文件时,可能会因为编码问题出现乱码。常见的解决方案包括:
- 使用系统编码:在 Windows 系统上,可以将 CSV 文件编码设置为 GBK,以避免乱码。
- 增加 BOM 头:在 UTF-8 编码的文件中,可以添加 BOM 头,这样 Excel 能自动识别编码。
编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08