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         }

 

總結

一直以來都在研究架構和平臺方面的技術,這是第一篇功能類庫的文章,希望可以對您有助。

 

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