導述
平常程序中導出csv都是採用第三方工具包,使用第三方工具包可以很方便的導出,但前提是項目中需要加入一個新的依賴。在某些情況下,只是簡單的導出csv,不希望增加項目依賴。那就看下如何直接寫出csv文件吧
在寫出csv前,我們首先要了解csv格式。
csv 格式簡介
逗號分隔值(Comma-Separated Values,CSV,有時也稱爲字符分隔值,因爲分隔字符也可以不是逗號),其文件以純文本形式存儲表格數據(數字和文本)。純文本意味着該文件是一個字符序列,不含必須像二進制數字那樣被解讀的數據。CSV文件由任意數目的記錄組成,記錄間以某種換行符分隔;每條記錄由字段組成,字段間的分隔符是其它字符或字符串,最常見的是逗號或製表符。通常,所有記錄都有完全相同的字段序列。通常都是純文本文件。
流輸出:PrintWriter
java 中流類圖
PrintWriter 是字符類型的打印輸出流,它繼承於Writer。
代碼實現
實現邏輯主要分爲:
- 處理每行的特殊格式字符。
- 每個屬性之間添加逗號分隔。
- 輸出
/**
* 寫出到csv文件
* @param csvFileName
* @param data
* @throws FileNotFoundException
*/
public void wirterCsv(String csvFileName, List<String[]> data)
throws FileNotFoundException, UnsupportedEncodingException {
File csvOutputFile = new File(csvFileName);
try (PrintWriter pw = new PrintWriter(csvOutputFile, "GBK")) {
data.stream()
.map(this::convertToCSV)
.forEach(pw::println);
}
}
public String convertToCSV(String[] data) {
return Stream.of(data)
.map(this::escapeSpecialCharacters)
.collect(Collectors.joining(","));
}
public String escapeSpecialCharacters(String data) {
String escapedData = data.replaceAll("\\R", " ");
if (data.contains(",") || data.contains("\"") || data.contains("'")) {
data = data.replace("\"", "\"\"");
escapedData = "\"" + data + "\"";
}
return escapedData;
}
在寫出過程中,要留意亂碼問題,本文設置爲GBK格式防止中文亂碼
總結
經常爲了避免重複造輪子,使用了很多便利的工具。但使用輪子的前提是,自己能創造輪子。尤其是編程基礎,輪子用的太多,自己不會走了,就比較尷尬。
基礎編程屬於通過練習的方式嘗試,偶爾跑掉輪子,試試自己還能跑起來不。
爲方便交流,可以加個關注吆!