# 前言 最近公司一個新的項目,因為需要存儲的數據很少,單獨去部署一個資料庫去存儲該數據顯然是不划算的,所以想的是通過存入csv文件中來代替存入資料庫中。說乾就乾。 ## 什麼是csv文件 CSV代表逗號分隔值(Comma-Separated Values),是一種常見的文本文件格式,用於存儲表格數 ...
前言
最近公司一個新的項目,因為需要存儲的數據很少,單獨去部署一個資料庫去存儲該數據顯然是不划算的,所以想的是通過存入csv文件中來代替存入資料庫中。說乾就乾。
什麼是csv文件
CSV代表逗號分隔值(Comma-Separated Values),是一種常見的文本文件格式,用於存儲表格數據,例如電子錶格和資料庫中的數據。CSV文件以純文本形式表示數據,其中每行代表一條記錄,而每行中的欄位則使用逗號或其他特定分隔符來分隔。
CSV文件的基本結構如下:
欄位1,欄位2,欄位3,欄位4,...
值1,值2,值3,值4,...
值1,值2,值3,值4,...
...
在這個結構中,第一行通常是欄位名,描述了每個列中存儲的數據類型或含義。隨後的行包含實際的數據值,每個值對應於其相應列中的欄位。
雖然稱為“逗號分隔值”,但實際上分隔符並不一定是逗號。某些情況下,製表符(Tab)或分號等其他字元也可以用作分隔符,具體取決於文件的規範或數據的特定要求。
以下是一個簡單的示例:
姓名,年齡,性別,城市
Alice,25,女,紐約
Bob,30,男,洛杉磯
Cathy,22,女,芝加哥
CSV文件非常常見,因為它們易於生成和解析,可以被許多不同的應用程式和編程語言處理。例如,許多電子錶格軟體(如Microsoft Excel、Google Sheets)和資料庫系統都支持CSV文件的導入和導出。這使得CSV文件成為在不同系統之間共用數據的一種通用方式。
存入csv文件
其實存入csv文件有很多種方法,今天我們主要講的是@CsvBindByPosition註解的方式。
導入相應的依賴
點擊查看
<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>5.6</version>
</dependency>
實體類加註解
@CsvBindByPosition(position = 0)
private String eventId;
@CsvBindByPosition(position = 1)
private String srcIndex;
@CsvBindByPosition(position = 2)
private String srcName;
@CsvBindByPosition(position = 3)
private Integer eventType;
@CsvBindByPosition(position = 4)
private String happenTime;
@CsvBindByPosition(position = 5)
private Integer realValue;
@CsvBindByPosition(position = 6)
private Integer isAlarm;
進行文件寫入操作
new FileOutputStream(file, true)如果填的是true表示是在文件後面追加寫入,預設是false,false就會導致後面的覆蓋前面的內容。我這邊需求是追加寫入,所以寫的是true。然後採用了時間來命名csv文件,方便後面查詢的時候可以按照時間來查詢對應的數據。
/**
* 一行行向CSV寫入內容
*
* @param
* @param dataList 數據集合
* @param
* @param
*/
public void writeDataListToCsv(List<DataGram> dataList) {
//獲取項目根目錄下的file文件夾路徑
String filePath = System.getProperty("user.dir") + "/file";
//獲取當前時間
String curTime = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
String path = null;
try {
path = new File(filePath, curTime + "warn.csv").getCanonicalPath();
File file = new File(path);
if (!file.exists()) {
file.createNewFile();
}
OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(file, true), Charset.forName("UTF-8"));
StatefulBeanToCsv<DataGram> statefulBeanToCsv = new StatefulBeanToCsvBuilder<DataGram>(writer)
.withApplyQuotesToAll(false)
.build();
try {
statefulBeanToCsv.write(dataList);
} catch (CsvDataTypeMismatchException e) {
e.printStackTrace();
} catch (CsvRequiredFieldEmptyException e) {
e.printStackTrace();
}
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
讀取csv文件的內容
/**
* 基於CsvBindByPosition註解映射的讀取
*
*
*/
public List csvToBeanByPositionAnnotation() {
String filePath = System.getProperty("user.dir") + "/file";
String curTime = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
String path = null;
try {
path = new File(filePath, curTime + "warn.csv").getCanonicalPath();
File fileLast = new File(path);
if (fileLast.exists()){
InputStreamReader reader = new InputStreamReader(new FileInputStream(path), Charset.forName("UTF-8"));
// 不需要標題行,列的順序通過CsvBindByPosition註解的position屬性指定
CsvToBean<DataGram> csvToBean = new CsvToBeanBuilder<DataGram>(reader)
.withType(DataGram.class)
.build();
List<DataGram> list = csvToBean.parse();
reader.close();
return list;
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
效果展示
DataGram dataGram = new DataGram("1","2","3",4,"5",7,9);
DataGram dataGram1 = new DataGram("a","b","c",2,"e",2,2);
List<DataGram> list = new ArrayList<>();
list.add(dataGram);
list.add(dataGram1);
writeDataListToCsv(list);
List list = csvToBeanByPositionAnnotation();
System.out.print(list);
至此所有的操作都完成了,當然面對不同的需求會有不同的寫入方法,寫入csv文件的方法肯定也不會只有這一種。感謝大家觀看。