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相关推荐
- 用Obspy读取segy的文件头并保存到csv数据库
用Obspy读取segy的文件头并保存到csv数据库 文章目录 用Obspy读取segy的文件头并保存到csv数据库 读入Segy文件 检查头文件 保存道头 保存道头到csv 读入Segy文件 fro ...
- Csv解析CsvFile
Excel导出是非常常见的需求,而大多数时候只需要导出CSV格式文件即可.Csv文件非常简单以及快速,除了日常导出报表,还可以导出大量数据用于跨系统数据交换,曾经多次遇到一次性导出数百万行数据.New ...
- 收藏!用Python一键批量将任意结构的CSV文件导入MySQL数据库。
Python有很多库可以对CSV文件和Excel文件进行自动化和规模化处理.但是,使用数据库可以将计算机完成任务的能力提升成千上万倍! 那么问题来了,如果有很多个文件需要导入数据库,一个一个操作效率太 ...
- 前5名最佳SQL数据库恢复软件
导言 在本文中,我们将研究最优秀的5种SQL数据库恢复软件,这些软件将帮助我们从损坏的.mdf和.ndf文件中恢复和恢复数据库.在这里,我将教您如何操作该软件,以及它们将如何为我们恢复文件. 前5名最 ...
- Spark学习(1)-Spark基础
1 spark定义 定义:Apache Spark是用于大规模数据(large-scala data)处理的统一(unified)分析引擎. Spark是一款分布式内存计算的统一分析引擎. 其特点就是 ...
- 效验文件后缀及其流后缀 是否验证;文件大小
效验文件后缀及其流后缀 是否验证 1.开始调用初始接口类 调用接口 工具类 FileTypeUtil 工具类 2.文件大小控制 工具类 1.开始调用初始接口类 this.fileValidata(fi ...
- 楼宇自控系统服务器 含软件,霍尼韦尔honeywell楼宇自控系统及现场设备 产品清单...
霍尼韦尔honeywell楼宇自控系统,管理软件系统,控制模块,房间单元等系列齐全,质量保证,欢迎随时来电:13301258862 型号 名称 TH228WPN 地暖面板 TF228WN/ ...
- 基于ZBar,OpenCV和Python的二维码识别
0 前言 今天分享一个之前做过的二维码识别,参考:https://www.pyimagesearch.com/2018/05/21/an-opencv-barcode-and-qr-code-scan ...
- python多线程爬表情包,斗图斗够瘾~
前言 嗨喽!大家好,这里是魔王. 什么?群里又在斗图 (+_+)? 别动让我来(>人<:) 教你一招爬取海量表情包图片, 从此告别图慌 !!! 课 题:python爬取海量表情包 课程亮点 ...
最新文章
- 秋招面经来了,收藏!
- Linux系统命令审计
- scrum与第一次teamwork
- Box 'laravel/homestead' could not be found.
- 解决python在pycharm中可以import本地文件,但命令行运行时报错:no model named xxxx本地文件
- (13)ZYNQ AXI总线应用范围(学无止境)
- 第一次带姐姐和弟弟去看海
- H2最完整的资料下载地址:
- Bailian2786 Pell数列【数列】(POJ NOI0102-1788,POJ NOI0103-1788)
- 190228每日一句
- python做客户端监控程序(python 监控程序)
- dataframe 查找的isin()用法
- 量子点电视,下一代显示技术的必争之地
- diskgenius软件将分区表类型转换成GUID,提示磁盘的首尾部分没有转换到GUID分区所必须的空间,还需各33个扇区,不能转换成功
- PCB设计——Altium Dsigner18之PCB与原理图交互式布局设计
- Windows 7 彻底退出历史舞台
- 统计综合指标有哪些?
- ECB oracle——attack
- android 音频裁剪(1)—MP3裁剪
- 简练软考知识点整理-云大物移智区加
热门文章
- Java笔记:包装类、toString()方法、单例类、比较(==和equals方法)
- linux下搭建go环境--问题记录
- js进阶 11-6 jquery如何获取和设置元素的宽高(jquery多方法)
- AngularJS $watch 性能杀手
- python list对象
- jquery weui 中alert弹出框在ios中跳动问题
- [Unity 游戏设计的元素]
- 【慢慢学算法】:查找第k小数
- SQL Azure Reporting CTP
- 面向全球用户的Teams app之Culture计量单位和禁忌篇