前言
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 }
總結
一直以來都在研究架構和平臺方面的技術,這是第一篇功能類庫的文章,希望可以對您有助。