Csv数据库CsvDb
生活随笔
收集整理的這篇文章主要介紹了
Csv数据库CsvDb
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在工控領域,經常遇到斷電關機數據庫文件損壞的情況,SQLite如此,LiteDb也是這樣。ZTO有數萬自動化掃描設備,每天都有數百臺設備因斷電數據庫損壞等原因,而不得不重裝軟件。因此,設計了CsvDb,用于本地保存少量數據,一般只有幾百幾千行,極限不超過十萬行。
Nuget包:NewLife.Core
源碼地址:https://github.com/NewLifeX/X/blob/master/NewLife.Core/IO/CsvDb.cs
插入數據
Add插入一個對象(一行數據)到末尾。
var db = new CsvDb<GeoArea>((x, y) => x.Code == y.Code) {FileName = "data/db.csv" }; var model = new GeoArea {Code = Rand.Next(),Name = Rand.NextString(14), }; db.Add(model);// 把文件讀出來 var lines = File.ReadAllLines(db.FileName.GetFullPath()); Assert.Equal(2, lines.Length);實例化CsvDb時,需要指定模型類,它決定數據格式。構造函數中還可以指定比較器,可以理解為主鍵字段,用于查找目標數據行。
跑起來效果是這樣:
查找數據
Find 用于查找一個對象,本質上引擎內部會遍歷所有數據行,逐行對比主鍵。
var db = new CsvDb<GeoArea>((x, y) => x.Code == y.Code) {FileName = "data/db.csv" }; var model = db.Find(new GeoArea { Code = 1234 });此外,還可以使用 FindAll 查找多行滿足條件的數據,指定委托。
public IList<T> FindAll(); IList<T> FindAll(Func<T, Boolean> predicate, Int32 count = -1); Int32 FindCount();更新數據
Update 用于更新一個對象,本質上讀取所有數據進入內存,修改對應數據后再寫回去,成本較高,在數據量不大(小于1萬)時問題不大。
var db = new CsvDb<GeoArea>((x, y) => x.Code == y.Code) {FileName = "data/db.csv" }; var model = new GeoArea {Code = 1234,Name = "Stone", }; db.Update(model);刪除數據
Remove 用于刪除滿足條件的對象,本質上讀取所有數據進入內存,刪除滿足條件的對象后寫回去,成本較高。如果刪除后沒有剩余數據行,則直接刪除文件。
Int32 Remove(T model); Int32 Remove(IEnumerable<T> models); Int32 Remove(Func<T, Boolean> predicate);總結
數萬工控設備多年實踐表明,Csv數據庫很靠譜!
在斷電關機的時候,csv文件同樣也會損壞,只不過是CsvDb讀取時跳過無法解析的錯誤行,避免了應用崩潰。
總結
以上是生活随笔為你收集整理的Csv数据库CsvDb的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Csv解析CsvFile
- 下一篇: 93.7%的程序员!竟然都不知道Redi