介紹
逗號分隔值(Comma-Separated Values,CSV,有時也稱為字符分隔值,因為分隔字符也可以不是逗號),其文件以純文本形式存儲表格數據(數字和文本)。
Hutool針對此格式,參考FastCSV項目做了對CSV文件讀寫的實現(Hutool實現完全獨立,不依賴第三方)
CsvUtil
是CSV工具類,主要封裝了兩個方法:
- getReader 用於對CSV文件讀取
- getWriter 用於生成CSV文件
這兩個方法分別獲取CsvReader
對象和CsvWriter
,從而獨立完成CSV文件的讀寫。
使用
讀取CSV文件
讀取為CsvRow
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中的一個單元格(既逗號分隔部分)
Console.log(csvRow.getRawList());
}
CsvRow
對象還記錄了一些其他信息,包括原始行號等。
讀取為Bean列表
首先測試的CSV:test_bean.csv
:
姓名,gender,focus,age
張三,男,無,33
李四,男,好對象,23
王妹妹,女,特別關注,22
- 定義Bean:
// lombok注解
@Data
private static class TestBean{
// 如果csv中標題與字段不對應,可以使用alias注解設置別名
@Alias("姓名")
private String name;
private String gender;
private String focus;
private Integer age;
}
- 讀取
final CsvReader reader = CsvUtil.getReader();
//假設csv文件在classpath目錄下
final List<TestBean> result = reader.read(
ResourceUtil.getUtf8Reader("test_bean.csv"), TestBean.class);
- 輸出:
CsvReaderTest.TestBean(name=張三, gender=男, focus=無, age=33)
CsvReaderTest.TestBean(name=李四, gender=男, focus=好對象, age=23)
CsvReaderTest.TestBean(name=王妹妹, gender=女, focus=特別關注, age=22)
生成CSV文件
//指定路徑和編碼
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"}
);
效果如下:
注意
CSV文件本身為一種簡單文本格式,有編碼區分。Excel讀取CSV文件中含有中文時時必須為GBK編碼(Windows平台下),否則會出現亂碼。