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)文章
Spring Boot 部署過程解析(jar or war)
這篇文章主要介紹了Spring Boot 部署過程解析(jar or war),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
Java實(shí)現(xiàn)的進(jìn)制轉(zhuǎn)換工具類完整示例
這篇文章主要介紹了Java實(shí)現(xiàn)的進(jìn)制轉(zhuǎn)換工具類,結(jié)合完整實(shí)例形式分析了Java實(shí)現(xiàn)二進(jìn)制、十六進(jìn)制、字符串、數(shù)組等相關(guān)轉(zhuǎn)換操作技巧,需要的朋友可以參考下2018-07-07
完美解決Eclipse 項(xiàng)目有紅感嘆號(hào)的問題
下面小編就為大家?guī)硪黄昝澜鉀QEclipse 項(xiàng)目有紅感嘆號(hào)的問題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-01-01
Java數(shù)據(jù)結(jié)構(gòu)之簡(jiǎn)單鏈表的定義與實(shí)現(xiàn)方法示例
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)之簡(jiǎn)單鏈表的定義與實(shí)現(xiàn)方法,簡(jiǎn)單描述了鏈接的概念、原理,并結(jié)合實(shí)例形式分析了java定義與使用鏈表的相關(guān)步驟與操作技巧,需要的朋友可以參考下2017-10-10
mybatis返回map結(jié)果集@MapKey使用的場(chǎng)景分析
這篇文章主要介紹了mybatis返回map結(jié)果集@MapKey使用的場(chǎng)景分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
Java?Cookie與Session實(shí)現(xiàn)會(huì)話跟蹤詳解
session的工作原理和cookie非常類似,在cookie中存放一個(gè)sessionID,真實(shí)的數(shù)據(jù)存放在服務(wù)器端,客戶端每次發(fā)送請(qǐng)求的時(shí)候帶上sessionID,服務(wù)端根據(jù)sessionID進(jìn)行數(shù)據(jù)的響應(yīng)2022-11-11

