Пример #1
0
        public static object Acc(Station1.ConfigFile cfg, List <Station1.InputItem> rawdata, Expression expression, int CountAcc)
        {
            var result = CountAcc;

            // init 計算式
            Expression _e         = new Expression(expression.ParsedExpression, EvaluateOptions.NoCache);
            DateTime   currentTIM = cfg.CurrentTIM;

            List <Station1.InputItem> lastrawdata = rawdata.Where(x => x.TIM <= currentTIM).Select(s => s).OrderByDescending(t => t.TIM).Take(CountAcc + 1).ToList();

            Station1.InputItem lastDataItem = lastrawdata.FirstOrDefault();

            // 處理客制 function
            _e.EvaluateFunction += delegate(string name, FunctionArgs args)
            {
                switch (name)
                {
                case "diff":
                    args.Result = Diff(lastrawdata, args.Parameters[0], currentTIM);
                    break;
                }
            };

            return(_e.Evaluate());
        }
Пример #2
0
        public static object Diff(List <Station1.InputItem> rawdata, Expression expression, DateTime currentTIM)
        {
            decimal totalAcc = 0;

            Station1.InputItem lastDataItem = rawdata.FirstOrDefault();

            expression.EvaluateParameter += delegate(string name, ParameterArgs args)
            {
                foreach (Station1.InputItem _rawdata in rawdata)
                {
                    if (currentTIM != default(DateTime))
                    {
                        Station1.InputItem thisDataItem = _rawdata;

                        int thisColIndex = thisDataItem.Header.IndexOf(name);
                        int lastColIndex = lastDataItem.Header.IndexOf(name);

                        if (lastColIndex != -1)
                        {
                            decimal lastColNum = decimal.TryParse(thisDataItem.Line[lastColIndex], out lastColNum) ? lastColNum : 0;
                            decimal thisColNum = decimal.TryParse(lastDataItem.Line[thisColIndex], out thisColNum) ? thisColNum : 0;

                            // 如果前一筆大於此筆則不相減
                            if (lastColNum > thisColNum)
                            {
                                lastColNum = 0;
                            }

                            totalAcc = totalAcc + (thisColNum - lastColNum);
                        }

                        lastDataItem = thisDataItem;
                    }
                }

                args.Result = totalAcc;
            };

            return(expression.Evaluate());
        }
Пример #3
0
        private static List <Station1.ConfigFile.Line> DoAcc(Station1 sta, string tag)
        {
            List <Station1.InputItem> processInputItem = sta.InputItems.Where(x => string.Compare(x.FileName, sta.LastFileName) > 0).ToList();

            Station1.ConfigFile cfg = sta.ConfigFiles.Where(x => x.Tag == tag).FirstOrDefault();
            cfg.Lines.Clear(); // 先清空, 避免累積

            // 無資料返回
            if (cfg == null)
            {
                return(null);
            }

            // 1.讀取資料
            foreach (Station1.InputItem inputitem in processInputItem)
            {
                List <string> outputline = new List <string>();
                DateTime      tim        = default(DateTime);
                // 處理 TIM
                if (inputitem.Header.IndexOf("TIM") != -1)
                {
                    DateTime.TryParseExact(inputitem.Line[inputitem.Header.IndexOf("TIM")], "yyyy-MM-ddTHH:mm:ss+08:00", null, System.Globalization.DateTimeStyles.None, out tim);
                    cfg.CurrentTIM = tim;
                }

                foreach (string col in cfg.Col)
                {
                    int    colIndex = inputitem.Header.IndexOf(col);
                    string colData  = "";

                    // 處理特殊欄位
                    if (col == "TIMD")
                    {
                        colIndex = inputitem.Header.IndexOf("TIM");
                        colData  = inputitem.Line[colIndex].Substring(0, 10);
                    }
                    else if (col == "TIMT")
                    {
                        colIndex = inputitem.Header.IndexOf("TIM");
                        colData  = inputitem.Line[colIndex].Substring(11, 8);
                    }
                    else if (col == "TIM")
                    {
                        // 特別客製, TIM 產生二個欄位
                        colIndex = inputitem.Header.IndexOf("TIM");
                        colData  = inputitem.Line[colIndex].Substring(0, 10);
                        outputline.Add(colData);

                        colData = inputitem.Line[colIndex].Substring(11, 8);
                    }
                    else if (colIndex == -1)
                    {
                        // 關鍵字 calc() 為
                        string exp = Regex.Match(col, @"(?<=calc\()(.*)(?=\))").Groups[1].Value;

                        if (string.IsNullOrEmpty(exp))
                        {   // 輸入文字,直接輸入
                            colData = col;
                        }
                        else
                        {
                            // 檢查是否為 acc, 得到 #筆數
                            bool isAcc    = (Regex.Match(col, @"(?<=acc\()(.*)(?=\))").Groups[1].Value != "");
                            int  countAcc = 0;
                            if (isAcc)
                            {
                                countAcc = int.TryParse(Regex.Match(col, @"(?<=#)([^\)]*)").Groups[1].Value, out countAcc) ? countAcc : 0;
                                exp      = exp.Replace("#" + countAcc.ToString(), "");
                            }

                            // init 計算式
                            Expression e = new Expression(exp, EvaluateOptions.NoCache);

                            // 處理參數
                            e.EvaluateParameter += delegate(string name, ParameterArgs args)
                            {
                                int _colIndex = inputitem.Header.IndexOf(name);
                                if (_colIndex != -1)
                                {
                                    args.Result = inputitem.Line[_colIndex].Trim();
                                }
                            };

                            // 處理客制 function
                            e.EvaluateFunction += delegate(string name, FunctionArgs args)
                            {
                                switch (name)
                                {
                                case "diff":
                                    //args.Result = Diff(pe, sta.DataItems, args.Parameters[0]);
                                    DateTime currentTIM = cfg.CurrentTIM;
                                    List <Station1.InputItem> lastrawdata  = sta.InputItems.Where(x => x.TIM <= currentTIM).Select(s => s).OrderByDescending(t => t.TIM).Take(2).ToList();
                                    Station1.InputItem        lastDataItem = lastrawdata.FirstOrDefault();
                                    args.Result = Diff(lastrawdata, args.Parameters[0], currentTIM);
                                    break;

                                case "acc":
                                    args.Result = Acc(cfg, sta.InputItems, args.Parameters[0], countAcc);
                                    break;
                                }
                            };

                            // 計算式,數字去尾數 0.100 -> 0.1
                            colData = DoExpressionEvaluate(e);
                        }
                    }
                    else
                    { // 一般取值,不計算
                        colData = inputitem.Line[colIndex].Trim();
                    }

                    outputline.Add(colData);
                }

                if (outputline.Count > 0)
                {
                    cfg.Lines.Add(new Station1.ConfigFile.Line {
                        TIM = tim, ColItems = outputline
                    });
                }
            }

            return(cfg.Lines);
        }
Пример #4
0
        private void CSVInput(Station1 sta)
        {
            logView.Add("讀取資料:" + sta.StationName);

            // 更新最後讀取資料
            cgiLastFiles.Reload();

            // 清除舊資料
            sta.InputItems.Clear();

            sta.LastFileName = cgiLastFiles.DataItems.Where(x => x.Key == sta.StationName).Count() > 0
                ? cgiLastFiles.DataItems.Where(x => x.Key == sta.StationName).FirstOrDefault().Value : "";

            // 讀取 CSV file
            DirectoryInfo dir = new DirectoryInfo(sta.InputPath);

            String sLastFileName72Hr = default(DateTime).ToString("yyyyMMddHHmmss") + ".txt";

            if (sta.LastFileTime != default(DateTime))
            {
                sLastFileName72Hr = sta.LastFileTime.AddHours(-72).ToString("yyyyMMddHHmmss") + ".txt";
            }

            // 1.找出最後一筆記錄及之前 72 小時記錄
            FileInfo[] files = dir.GetFiles("*", SearchOption.AllDirectories)
                               .Where(x => x.Name.Contains(".csv") && string.Compare(x.Name, sLastFileName72Hr) >= 0)
                               .OrderBy(x => x.Name).ToArray();

            // 增加到 staion
            foreach (FileInfo file in files)
            {
                try
                {   // 2.Open the text file using a stream reader.
                    List <dynamic> records;
                    using (var reader = new StreamReader(file.FullName))
                    {
                        using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
                        {
                            records = csv.GetRecords <dynamic>().ToList();

                            var                record   = records[0];
                            var                obj1     = record as System.Dynamic.ExpandoObject;
                            DateTime           tim      = default(DateTime);
                            Station1.InputItem dataitem = new Station1.InputItem()
                            {
                                Header = obj1.Select(a => a.Key).ToList(),
                                Line   = obj1.Select(a => a.Value.ToString()).ToList()
                            };

                            // 加入 tim
                            DateTime.TryParseExact(dataitem.Line[dataitem.Header.IndexOf("TIM")], "yyyy-MM-ddTHH:mm:ss+08:00", null, System.Globalization.DateTimeStyles.None, out tim);
                            dataitem.TIM = tim;

                            dataitem.FileName = file.Name;

                            sta.InputItems.Add(dataitem);
                        }
                    }
                    // 記錄最後一次檔名
                    sta.NewLastFileName = file.Name;
                }
                catch (IOException err)
                {
                    logView.Add("讀取CGI檔案錯誤: " + file.Name + ", ERROR." + err.Message);
                }
            }

            foreach (Station1.ConfigFile cfg in sta.ConfigFiles)
            {
                logView.Add("統計資料中: " + cfg.Tag);

                // 計算資料
                cfg.Lines = DoAcc(sta, cfg.Tag);

                // 正式寫入檔案 HH
                DoOutputHH(cfg, sta.OutputPath);
                // 正式寫入檔案 month
                DoOutputMonth(cfg, sta.OutputPath);
            }

            // 最新最後資料
            cgiLastFiles.UpdateLastFile(sta.StationName, sta.NewLastFileName);
        }