kbnet.toolkit.formulas

前言

2024年3月份马上就要结束,困扰我近2个月的感冒总算要痊愈了,为此特别发布本篇文章以示安慰。

kbnet.toolkit.formulas是一个.net/c#类库,提供类似Excel一样的公式用于计算数据,当然没有excel公式那么多、那么全,但是应该足够使用了。用它来做什么?难道用它来自己实现一个excel软件么?如果有此需求是可以的,其实我设计实现它的主要目的是为了数据检查和消息预警,尤其是物联网场景。下位机采集各个传感器的数据,然后提交到服务器,此时接收到数据的服务器第一步应该做什么,也许是存起来,好吧,除此之外,是不是应该根据传感器的数值做判断,从而验证传感器现场的环境状态,比如温度、压力、流速、风力等等,然后对超出数值范围的传感器发出消息预警,使得运维人员即时了解情况,从而避免各类生产事故的发生。当然,你可能会说用其他办法一样可以实现,为什么要用kbnet.toolkit.formulas这个类库,比如sql数据库、时序数据库、或者让程序员写个程序,没错,实现类似需求的方式方案有多种,只是我想说相比较于其他方案,使用这个类库也有好处的,第一它不会给sql数据库造成巨大的检索压力,第二它可以任意配置正确的公式,不仅可以检测一个点的数据,还可以几个点同时作为条件运算,第三它不需要程序员等技术人员参与,只要是会编写excel公式的工作人员,就能设置和使用,更加不需要算法工程师瞎捣鼓算法,那么你现在认识到它的价值了么?也许你还会发现其他更多好处。

 

废话不多说了,直接上类库地址:

https://www.alipan.com/s/bZmX8KkdpV9
提取码: 2b4w

.net4x:表示.net framework 4.8.1

.net6:表示.net 6

.net8:表示.net 8

 

测试代码

 1 public static void Test()
 2         {
 3             Formula.Init();
 4 
 5             var dList = new List<DataModel>();
 6 
 7             Console.WriteLine("程序暂时支持的运算符如下:异或^、并且&&、或者||、加法+、减法-、乘法*、除法/、取余%、等于=、不等于!=、不等于<>、大于>、大于等于>=、小于<、小于等于<=");
 8             Console.WriteLine("");
 9             Console.WriteLine("以下内容是在测试随机数据和定义的公式是否正确运行,其中{\"R\":\"1\"}表示一个测点。");
10             Random rd = new Random();
11             int testCount = 0;
12             while (true)
13             {
14                 testCount++;
15                 dList.Clear();
16 
17                 Console.WriteLine("**************************************");
18                 for (int d = 0; d < 1; d++)
19                 {
20                     for (int i = 0; i < 2; i++)
21                     {
22                         dList.Add(new DataModel { SheetName = "Test", ColumnName = "Device" + (d + 1).ToString(), RowName = (i + 1).ToString(), CellValue = rd.Next(200), RecordTime = DateTime.Now });
23                     }
24                 }
25                 foreach (var item in dList)
26                 {
27                     Console.WriteLine($"区域ID:{item.SheetName},设备ID:{item.ColumnName},测点ID:{item.RowName},测点值:{item.CellValue}");
28                 }
29                 var expression = "({\"R\":\"1\"}>0)&&({\"R\":\"2\"}<50)";
30                 Console.WriteLine($"公式:{expression}");
31                 var f = Formula.Parse(expression);
32                 var r = f.Compute(dList);
33                 if (r != null)
34                 {
35                     Console.WriteLine($"第 {testCount} 次,测试结果:" + r.Result.ToString());
36                 }
37 
38                 Console.WriteLine("**************************************");
39                 Console.WriteLine("是否继续测试?(y/n)");
40                 var ckey = Console.ReadLine();
41                 if (ckey.ToLower() != "y")
42                 {
43                     break;
44                 }
45             }
46 
47             Console.WriteLine("");
48             Console.WriteLine("**************************************");
49             Console.WriteLine("是否想继续测试数学运算?比如想计算表达式 \"(-1*(1+2+3+4+5)/2*-1+0.5)%3\" 的运算结果,如果想知道请输入计算公式:");
50             testCount = 0;
51             while (true)
52             {
53                 testCount++;
54 
55                 var cFunc = Console.ReadLine();//"1+1+(10/2*5-10)-50";
56                 if (!string.IsNullOrEmpty(cFunc) && !string.IsNullOrWhiteSpace(cFunc))
57                 {
58                     var f = Formula.Parse(cFunc);
59                     var r = f.Compute(dList);
60                     if (r != null)
61                     {
62                         Console.WriteLine($"第 {testCount} 次,测试结果:" + r.Result.ToString());
63                     }
64                     Console.WriteLine("#######################################");
65                     Console.WriteLine("是否继续测试?(y/n)");
66                     var ckey = Console.ReadLine();
67                     if (ckey.ToLower() != "y")
68                     {
69                         break;
70                     }
71                     else
72                     {
73                         Console.WriteLine("请输入公式:");
74                     }
75                 }
76                 else
77                 {
78                     Console.WriteLine("您输入的公式有误,请输入正确的公式");
79                 }
80             }
81 
82 
83             Console.WriteLine("");
84             Console.WriteLine("感谢使用程序,功能运行结束,按任意键退出...");
85             Console.ReadLine();
86         }

 

总结

一直以来都在研究架构和平台方面的技术,这是第一篇功能类库的文章,希望可以对您有助。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章