Java實(shí)現(xiàn)將類數(shù)據(jù)逐行寫入CSV文件的方法詳解
1. 需求和思路
最近要用java制作一個(gè)數(shù)據(jù)集,每一行是一個(gè)樣本,格式是csv。用了一下java類的相關(guān)概念,把csv文件里的每一行,即每一個(gè)樣本視為一個(gè)類。
2. 現(xiàn)有方法
目前已有的csv包如opencsv,可以支持字符串,也可以支持javabean(即java類)。相關(guān)教程如下
由于墻的原因,我maven老是下載不到opencsv的jar包,沒辦法我只能手寫個(gè)平民版的
3. 代碼
自定義的CodeObject類
public class CodeObject { private String filePath; private String methodName; private String content; public void setFilePath(String filePath){ this.filePath = filePath;} public void setMethodName(String methodName) { this.methodName = methodName;} public void setContent(String content) { this.content = content;} public String getFilePath() { return filePath;} public String getMethodName() { return methodName;} public String getContent() { return content;} }
mycsv類
import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; public class mycsv { private File csvFile; public mycsv(String fileName){ try { csvFile = new File(fileName); if (!csvFile.exists()){ csvFile.createNewFile(); } }catch (IOException e){ System.out.println("error in io"); } } public void writeCSVFile(String header[], ArrayList<CodeObject> cos){ try{ FileWriter fw = new FileWriter(csvFile); BufferedWriter bw = new BufferedWriter(fw); // 寫表頭 for (int i = 0; i < header.length; i++){ if (i < header.length-1){ bw.append(header[i] + ","); }else{ bw.append(header[i] + "\r\n"); } } // 寫數(shù)據(jù) for(CodeObject co: cos){ bw.append(co.getFilePath()+","); bw.append(co.getMethodName()+","); bw.append(CSVFormatter(co.getContent())+"\r\n"); } bw.close(); fw.close(); }catch (IOException e){ System.out.println("error in io"); } } public String CSVFormatter(String s){ if (s == null) { return ""; } if (s.contains("\"")) { s = s.replaceAll("\"", "\"\""); } return "\"" + s + "\""; } }
調(diào)用方式
public static void main(String[] args) { ArrayList<CodeObject> methods = new ArrayList<>(); /* 一些操作將數(shù)據(jù)寫入methods中 */ String header[] = {"FilePath", "MethodName", "Content"}; mycsv m = new mycsv("a.csv"); m.writeCSVFile(header, methods); }
4. 參考
因?yàn)槲易龅氖前裫ava文件里的方法切分開,每一個(gè)方法視為一個(gè)樣本,content的部分就是方法的代碼。由于方法里面有各種字符,如引號(hào),直接寫入csv會(huì)出現(xiàn)錯(cuò)位、串行、串列的問題。于是我在mycsv里面加了一個(gè)CSVFormatter,這塊代碼主要參考了下文。
Java處理CSV文件中的換行符等字符
開發(fā)的時(shí)候需要導(dǎo)出一批數(shù)據(jù),為了方便使用的CSV格式。當(dāng)時(shí)就只是簡(jiǎn)單的用逗號(hào)分隔,但是因?yàn)椴糠肿侄魏袚Q行符、引號(hào)、逗號(hào),導(dǎo)致用Excel打開的時(shí)候部分?jǐn)?shù)據(jù)錯(cuò)位了,于是又將那幾個(gè)字段處理了一下。
CSV文件本質(zhì)是一種用逗號(hào)和(回車)換行符分割的文本文件,是可以直接中Excel打開的。
處理方式就是在這個(gè)字段前后添加雙引號(hào),并且將字段中原有的雙引號(hào)替換為兩個(gè)雙引號(hào)。
/** * @author pzzhao * @version 創(chuàng)建時(shí)間:2022-5-8 14:46 */ public class CsvUtils { /** * @description: 處理csv文件字段中需要轉(zhuǎn)義的引號(hào) * 添加雙引號(hào),防止被字段中的逗號(hào)和換行符干擾 * 使其顯示為一個(gè)單元格 * @param value 待處理的字段值 * @return: {@link String} * @author: pzzhao * @date: 2022-05-08 14:49:46 */ public static String processValueForCsv(String value) { if (value == null) { return ""; } if (value.contains("\"")) { value = value.replaceAll("\"", "\"\""); } value = "\"" + value + "\""; return value; } }
網(wǎng)上有很多現(xiàn)成的CSV工具類的,使用的時(shí)候建議還是使用成熟的工具類,也就不用操心這些轉(zhuǎn)義字符的問題了。hutool 工具類里就有現(xiàn)成的CsvUtil。我這個(gè)是懶得引用額外的包,所以就自己簡(jiǎn)單處理了。
下面附上CSV文件個(gè)規(guī)則:
- 開頭是不留空,以行為單位。
- 可含或不含列名,含列名則居文件第一行。
- 一行數(shù)據(jù)不跨行,無空行。
- 以半角英文逗號(hào)(即,)作分隔符,列為空也要表達(dá)其存在。
- 列內(nèi)容如存在半角引號(hào)(即"),替換成半角雙引號(hào)(“”)轉(zhuǎn)義,即用半角引號(hào)(即"")將該字段值包含起來。
- 文件讀寫時(shí)引號(hào),逗號(hào)操作規(guī)則互逆。
- 內(nèi)碼格式不限,可為 ASCII、Unicode 或者其他。
- 不支持?jǐn)?shù)字
- 不支持特殊字符
到此這篇關(guān)于Java實(shí)現(xiàn)將類數(shù)據(jù)逐行寫入CSV文件的方法詳解的文章就介紹到這了,更多相關(guān)Java類數(shù)據(jù)寫入CSV文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)數(shù)組翻轉(zhuǎn)的實(shí)現(xiàn)代碼
這篇文章主要介紹了Java實(shí)現(xiàn)數(shù)組翻轉(zhuǎn)的實(shí)現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09springboot登陸頁面圖片驗(yàn)證碼簡(jiǎn)單的web項(xiàng)目實(shí)現(xiàn)
這篇文章主要介紹了springboot登陸頁面圖片驗(yàn)證碼簡(jiǎn)單的web項(xiàng)目實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-04-04Springboot 自定義校驗(yàn)代碼實(shí)例
這篇文章主要介紹了Springboot 自定義校驗(yàn)代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11在SpringBoot: SpringBoot里面創(chuàng)建導(dǎo)出Excel的接口教程
這篇文章主要介紹了在SpringBoot: SpringBoot里面創(chuàng)建導(dǎo)出Excel的接口教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-10-10Java SSM框架(Spring+SpringMVC+MyBatis)搭建過程
最近一段時(shí)間搭建了ssm環(huán)境,并測(cè)試了幾個(gè)小項(xiàng)目,下面小編通過圖文并茂的形式給大家分享Java SSM框架(Spring+SpringMVC+MyBatis)搭建過程,需要的朋友參考下吧2017-11-11spring?jpa集成依賴的環(huán)境準(zhǔn)備及實(shí)體類倉庫編寫教程
這篇文章主要為大家介紹了spring?jpa集成依賴的環(huán)境準(zhǔn)備及實(shí)體類倉庫編寫教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03