CSV文件处理工具-CsvUtil

CSV文件处理工具-CsvUtil

介绍

逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。

Hutool针对此格式,参考FastCSV项目做了对CSV文件读写的实现(Hutool实现完全独立,不依赖第三方)

CsvUtil是CSV工具类,主要封装了两个方法:

  • getReader 用于对CSV文件读取
  • getWriter 用于生成CSV文件

这两个方法分别获取CsvReader对象和CsvWriter,从而独立完成CSV文件的读写。

使用

读取CSV文件

读取为CsvRow

  1. CsvReader reader = CsvUtil.getReader();
  2. //从文件中读取CSV数据
  3. CsvData data = reader.read(FileUtil.file("test.csv"));
  4. List<CsvRow> rows = data.getRows();
  5. //遍历行
  6. for (CsvRow csvRow : rows) {
  7. //getRawList返回一个List列表,列表的每一项为CSV中的一个单元格(既逗号分隔部分)
  8. Console.log(csvRow.getRawList());
  9. }

CsvRow对象还记录了一些其他信息,包括原始行号等。

读取为Bean列表

首先测试的CSV:test_bean.csv:

  1. 姓名,gender,focus,age
  2. 张三,男,无,33
  3. 李四,男,好对象,23
  4. 王妹妹,女,特别关注,22
  1. 定义Bean:
  1. // lombok注解
  2. @Data
  3. private static class TestBean{
  4. // 如果csv中标题与字段不对应,可以使用alias注解设置别名
  5. @Alias("姓名")
  6. private String name;
  7. private String gender;
  8. private String focus;
  9. private Integer age;
  10. }
  1. 读取
  1. final CsvReader reader = CsvUtil.getReader();
  2. //假设csv文件在classpath目录下
  3. final List<TestBean> result = reader.read(
  4. ResourceUtil.getUtf8Reader("test_bean.csv"), TestBean.class);
  1. 输出:
  1. CsvReaderTest.TestBean(name=张三, gender=男, focus=无, age=33)
  2. CsvReaderTest.TestBean(name=李四, gender=男, focus=好对象, age=23)
  3. CsvReaderTest.TestBean(name=王妹妹, gender=女, focus=特别关注, age=22)

生成CSV文件

  1. //指定路径和编码
  2. CsvWriter writer = CsvUtil.getWriter("e:/testWrite.csv", CharsetUtil.CHARSET_UTF_8);
  3. //按行写出
  4. writer.write(
  5. new String[] {"a1", "b1", "c1"},
  6. new String[] {"a2", "b2", "c2"},
  7. new String[] {"a3", "b3", "c3"}
  8. );

效果如下: CSV文件处理工具-CsvUtil - 图1

注意 CSV文件本身为一种简单文本格式,有编码区分。Excel读取CSV文件中含有中文时时必须为GBK编码(Windows平台下),否则会出现乱码。