維基百科:
CSV是一種分隔的文字檔案,它使用逗號來分割值(許多CSV匯入/匯出工具的實現也允許使用其它的分隔符)。簡單的CSV實現可以禁止欄位值中包含逗號或其它特殊字元如換行符。更複雜的CSV實現允許這些特殊字元,它們往往要求用”(雙引號)包裹這些包含保留字元(如逗號、雙引號或不太通用的換行符)的數值。被嵌入的雙引號字元可以用連續兩個雙引號來表示(Creativyst 2010),或者使用跳脫字元如反斜槓(例如在Sybase Central中)。
在電腦科學術語中,CSV檔案可以被認為是一個「平面檔案資料庫」。
簡單來說,就是可以當作輕量資料儲存的方式,一種架構非常簡單的資料庫。
在這篇文章中,會用來儲存感測計的資料,將感測器資料儲存與取出,方便用作歷史紀錄圖表顯示。
1.導入maven: Apache Commons CSV
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-csv --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-csv</artifactId> <version>1.8</version> </dependency>
2.如何寫入CSV檔:
//如果是第一次建檔
//CSV的格式設定,使用\n作為換行標誌,並且第一行是Header(欄位標題)
CSVFormat format = CSVFormat.DEFAULT.withRecordSeparator("\n").withHeader({"time", "value"});
//建立FileWriter物件("檔案路徑", "是否接續寫入")
FileWriter csvWriter = new FileWriter("File檔案路徑", true);
//建立CSVPrinter物件
printer = new CSVPrinter(csvWriter, format);
//寫入一筆資料
printer.printRecord("1135", "20");
//完成寫入(怕傷flash的話就結束寫入此檔案時再使用)
printer.flush();
//如果是之後要接續寫入,會有第一行是Header的問題,需要避開他才不會增加了兩行Header
//我的方法是在建立CSVFormat時,判斷檔案是否存在,存在就withSkipHeaderRecord
if("File檔案路徑".isFile()){//檔案已存在,跳過Header處理
format = CSVFormat.DEFAULT.withRecordSeparator("\n").withHeader(csvHeader).withSkipHeaderRecord();
}else{
format = CSVFormat.DEFAULT.withRecordSeparator("\n").withHeader(csvHeader);
}
//最後,記得關閉資料流
try{
if(csvWriter != null){
csvWriter.flush();
printer.close(true);
csvWriter.close();
csvWriter = null;
printer = null;
System.out.println("寫檔已停止");
}
} catch (IOException e) {
e.printStackTrace();
}
3.如何讀取CSV檔:
//定義Header有哪些元素
private String[] csvHeader = new String[]{"time", "value"};
try{
Reader reader = Files.newBufferedReader(Paths.get("檔案路徑String"));
CSVParser csvParser = new CSVParser(reader, CSVFormat.DEFAULT
.withFirstRecordAsHeader()//第一筆紀錄是Header
.withIgnoreHeaderCase()
.withTrim());
//CSV是一行一行往下讀的,沒辦法跳著讀
for (CSVRecord csvRecord : csvParser) {
// Accessing values by Header names
//取得某欄位資料
String readTime = csvRecord.get(csvHeader[0]);
String readValue = csvRecord.get(csvHeader[1]);
//讀到的資料就可以在這邊存起來
xxx.put(readValue);
}
//記得關閉資料流
csvParser.close();
} catch (IOException e) {
e.printStackTrace();
}
在讀取中小量資料時,Apache Commons CSV就夠用了,但是如果讀取大量資料(幾十萬以上),可能就會明顯感到效率低。
這時可以用 FastCSV 來做讀取
https://github.com/osiegmar/FastCSV
日後再補上教學內容。
–END–
發佈留言