Java實(shí)現(xiàn)將類數(shù)據(jù)逐行寫入CSV文件的方法詳解
1. 需求和思路
最近要用java制作一個數(shù)據(jù)集,每一行是一個樣本,格式是csv。用了一下java類的相關(guān)概念,把csv文件里的每一行,即每一個樣本視為一個類。
2. 現(xiàn)有方法
目前已有的csv包如opencsv,可以支持字符串,也可以支持javabean(即java類)。相關(guān)教程如下
由于墻的原因,我maven老是下載不到opencsv的jar包,沒辦法我只能手寫個平民版的
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文件里的方法切分開,每一個方法視為一個樣本,content的部分就是方法的代碼。由于方法里面有各種字符,如引號,直接寫入csv會出現(xiàn)錯位、串行、串列的問題。于是我在mycsv里面加了一個CSVFormatter,這塊代碼主要參考了下文。
Java處理CSV文件中的換行符等字符
開發(fā)的時候需要導(dǎo)出一批數(shù)據(jù),為了方便使用的CSV格式。當(dāng)時就只是簡單的用逗號分隔,但是因?yàn)椴糠肿侄魏袚Q行符、引號、逗號,導(dǎo)致用Excel打開的時候部分?jǐn)?shù)據(jù)錯位了,于是又將那幾個字段處理了一下。
CSV文件本質(zhì)是一種用逗號和(回車)換行符分割的文本文件,是可以直接中Excel打開的。
處理方式就是在這個字段前后添加雙引號,并且將字段中原有的雙引號替換為兩個雙引號。
/**
* @author pzzhao
* @version 創(chuàng)建時間:2022-5-8 14:46
*/
public class CsvUtils {
/**
* @description: 處理csv文件字段中需要轉(zhuǎn)義的引號
* 添加雙引號,防止被字段中的逗號和換行符干擾
* 使其顯示為一個單元格
* @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工具類的,使用的時候建議還是使用成熟的工具類,也就不用操心這些轉(zhuǎn)義字符的問題了。hutool 工具類里就有現(xiàn)成的CsvUtil。我這個是懶得引用額外的包,所以就自己簡單處理了。
下面附上CSV文件個規(guī)則:
- 開頭是不留空,以行為單位。
- 可含或不含列名,含列名則居文件第一行。
- 一行數(shù)據(jù)不跨行,無空行。
- 以半角英文逗號(即,)作分隔符,列為空也要表達(dá)其存在。
- 列內(nèi)容如存在半角引號(即"),替換成半角雙引號(“”)轉(zhuǎn)義,即用半角引號(即"")將該字段值包含起來。
- 文件讀寫時引號,逗號操作規(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)容請搜索腳本之家以前的文章或繼續(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ì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
springboot登陸頁面圖片驗(yàn)證碼簡單的web項(xiàng)目實(shí)現(xiàn)
這篇文章主要介紹了springboot登陸頁面圖片驗(yàn)證碼簡單的web項(xiàng)目實(shí)現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-04-04
Springboot 自定義校驗(yàn)代碼實(shí)例
這篇文章主要介紹了Springboot 自定義校驗(yàn)代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-11-11
在SpringBoot: SpringBoot里面創(chuàng)建導(dǎo)出Excel的接口教程
這篇文章主要介紹了在SpringBoot: SpringBoot里面創(chuàng)建導(dǎo)出Excel的接口教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10
Java SSM框架(Spring+SpringMVC+MyBatis)搭建過程
最近一段時間搭建了ssm環(huán)境,并測試了幾個小項(xiàng)目,下面小編通過圖文并茂的形式給大家分享Java SSM框架(Spring+SpringMVC+MyBatis)搭建過程,需要的朋友參考下吧2017-11-11
spring?jpa集成依賴的環(huán)境準(zhǔn)備及實(shí)體類倉庫編寫教程
這篇文章主要為大家介紹了spring?jpa集成依賴的環(huán)境準(zhǔn)備及實(shí)體類倉庫編寫教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03

