在工控领域,经常遇到断电关机数据库文件损坏的情况,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相关推荐

  1. 用Obspy读取segy的文件头并保存到csv数据库

    用Obspy读取segy的文件头并保存到csv数据库 文章目录 用Obspy读取segy的文件头并保存到csv数据库 读入Segy文件 检查头文件 保存道头 保存道头到csv 读入Segy文件 fro ...

  2. Csv解析CsvFile

    Excel导出是非常常见的需求,而大多数时候只需要导出CSV格式文件即可.Csv文件非常简单以及快速,除了日常导出报表,还可以导出大量数据用于跨系统数据交换,曾经多次遇到一次性导出数百万行数据.New ...

  3. 收藏!用Python一键批量将任意结构的CSV文件导入MySQL数据库。

    Python有很多库可以对CSV文件和Excel文件进行自动化和规模化处理.但是,使用数据库可以将计算机完成任务的能力提升成千上万倍! 那么问题来了,如果有很多个文件需要导入数据库,一个一个操作效率太 ...

  4. 前5名最佳SQL数据库恢复软件

    导言 在本文中,我们将研究最优秀的5种SQL数据库恢复软件,这些软件将帮助我们从损坏的.mdf和.ndf文件中恢复和恢复数据库.在这里,我将教您如何操作该软件,以及它们将如何为我们恢复文件. 前5名最 ...

  5. Spark学习(1)-Spark基础

    1 spark定义 定义:Apache Spark是用于大规模数据(large-scala data)处理的统一(unified)分析引擎. Spark是一款分布式内存计算的统一分析引擎. 其特点就是 ...

  6. 效验文件后缀及其流后缀 是否验证;文件大小

    效验文件后缀及其流后缀 是否验证 1.开始调用初始接口类 调用接口 工具类 FileTypeUtil 工具类 2.文件大小控制 工具类 1.开始调用初始接口类 this.fileValidata(fi ...

  7. 楼宇自控系统服务器 含软件,霍尼韦尔honeywell楼宇自控系统及现场设备 产品清单...

    霍尼韦尔honeywell楼宇自控系统,管理软件系统,控制模块,房间单元等系列齐全,质量保证,欢迎随时来电:13301258862 型号    名称 TH228WPN    地暖面板 TF228WN/ ...

  8. 基于ZBar,OpenCV和Python的二维码识别

    0 前言 今天分享一个之前做过的二维码识别,参考:https://www.pyimagesearch.com/2018/05/21/an-opencv-barcode-and-qr-code-scan ...

  9. python多线程爬表情包,斗图斗够瘾~

    前言 嗨喽!大家好,这里是魔王. 什么?群里又在斗图 (+_+)? 别动让我来(>人<:) 教你一招爬取海量表情包图片, 从此告别图慌 !!! 课 题:python爬取海量表情包 课程亮点 ...

最新文章

  1. 秋招面经来了,收藏!
  2. Linux系统命令审计
  3. scrum与第一次teamwork
  4. Box 'laravel/homestead' could not be found.
  5. 解决python在pycharm中可以import本地文件,但命令行运行时报错:no model named xxxx本地文件
  6. (13)ZYNQ AXI总线应用范围(学无止境)
  7. 第一次带姐姐和弟弟去看海
  8. H2最完整的资料下载地址:
  9. Bailian2786 Pell数列【数列】(POJ NOI0102-1788,POJ NOI0103-1788)
  10. 190228每日一句
  11. python做客户端监控程序(python 监控程序)
  12. dataframe 查找的isin()用法
  13. 量子点电视,下一代显示技术的必争之地
  14. diskgenius软件将分区表类型转换成GUID,提示磁盘的首尾部分没有转换到GUID分区所必须的空间,还需各33个扇区,不能转换成功
  15. PCB设计——Altium Dsigner18之PCB与原理图交互式布局设计
  16. Windows 7 彻底退出历史舞台
  17. 统计综合指标有哪些?
  18. ECB oracle——attack
  19. android 音频裁剪(1)—MP3裁剪
  20. 简练软考知识点整理-云大物移智区加

热门文章

  1. Java笔记:包装类、toString()方法、单例类、比较(==和equals方法)
  2. linux下搭建go环境--问题记录
  3. js进阶 11-6 jquery如何获取和设置元素的宽高(jquery多方法)
  4. AngularJS $watch 性能杀手
  5. python list对象
  6. jquery weui 中alert弹出框在ios中跳动问题
  7. [Unity 游戏设计的元素]
  8. 【慢慢学算法】:查找第k小数
  9. SQL Azure Reporting CTP
  10. 面向全球用户的Teams app之Culture计量单位和禁忌篇