예제 #1
0
파일: AQCSV.cs 프로젝트: yanxuYX/examples
        public static AQCSVTimeSeries Load(string csv)
        {
            AQCSVTimeSeries ret = new AQCSVTimeSeries();

            if (string.IsNullOrEmpty(csv))
            {
                return(ret);
            }
            ret.metaData = new AQCSVMetaData();
            using (StringReader reader = new StringReader(csv))
            {
                string line      = null;
                int    lineCount = 0;
                //meta header
                line = reader.ReadLine();
                ret.metaData.headers = CSVUtil.splitCCVLine(line);
                ret.metaData.columns = ret.metaData.headers.Length;
                lineCount++;

                //meta data
                line = reader.ReadLine();
                ret.metaData.datas = CSVUtil.splitCCVLine(line);
                int rangeCount = int.Parse(ret.metaData["NumRanges"]);
                ret.ranges = new AQCSVTable[rangeCount];
                lineCount++;

                for (int i = 0; i < rangeCount; i++)
                {
                    ret.ranges[i] = AQCSVTable.Load(csv, null, "NumPoints", ref lineCount);
                }
                reader.Close();
            }
            return(ret);
        }
예제 #2
0
        public AllTablesResult LoadAllTables(int stepPrecision)
        {
            var result = new AllTablesResult();

            var tablesCsv = HydroModel.GetExpandedRatingTables(stepPrecision, CsvMetaHeader, CsvMetadata);

            if (string.IsNullOrEmpty(tablesCsv))
            {
                return(result);
            }

            var csvRatings = AQCSV.Load(tablesCsv, true, new[] { "NumTables", "NumPeriods", "NumPoints" });

            var tableNumber = CSVUtil.ToDouble(csvRatings.dataSet[0].datas, 0);
            var tableName   = CSVUtil.ToString(csvRatings.dataSet[0].datas, 1);
            var numPeriods  = CSVUtil.ToDouble(csvRatings.dataSet[0].datas, 2);
            var numPoints   = CSVUtil.ToDouble(csvRatings.dataSet[0].datas, 3);

            for (var i = 0; i < tableNumber.Length; ++i)
            {
                result.Tables.Add(new Table
                {
                    TableNumber = tableNumber[i],
                    TableName   = tableName[i],
                    NumPeriods  = numPeriods[i],
                    NumPoints   = numPoints[i]
                });
            }

            var tableNumber2 = CSVUtil.ToDouble(csvRatings.dataSet[1].datas, 0);
            var startDate    = CSVUtil.ToString(csvRatings.dataSet[1].datas, 1);
            var endDate      = CSVUtil.ToString(csvRatings.dataSet[1].datas, 2);

            for (var i = 0; i < tableNumber2.Length; ++i)
            {
                result.TableDates.Add(new TableDate
                {
                    TableNumber = tableNumber2[i],
                    StartDate   = DateTimeParser.Parse(LocationData, startDate[i]),
                    EndDate     = string.IsNullOrEmpty(endDate[i]) ? DateTimeOffset.MaxValue : DateTimeParser.Parse(LocationData, endDate[i])
                });
            }

            var tableNumber3 = CSVUtil.ToDouble(csvRatings.dataSet[2].datas, 0);
            var input        = CSVUtil.ToDouble(csvRatings.dataSet[2].datas, 1);
            var output       = CSVUtil.ToDouble(csvRatings.dataSet[2].datas, 2);

            for (var i = 0; i < tableNumber3.Length; ++i)
            {
                result.TableValues.Add(new TableValue
                {
                    TableNumber = tableNumber3[i],
                    Input       = input[i],
                    Output      = output[i]
                });
            }

            return(result);
        }
예제 #3
0
파일: AQCSV.cs 프로젝트: yanxuYX/examples
        /// <summary>
        /// Load csv.
        /// e.g. Load(csv, true, new string[]{"ExpandedPoints", "OriginalPoints"});
        /// </summary>
        /// <param name="csv">csv string used to load into AQCSV instance.</param>
        /// <param name="withMetaHader">If csv with metadata, this parameter should be true, otherwise set to false.</param>
        /// <param name="tablesRecordCount">string array, items used to show the number of records for each table.</param>
        /// <returns></returns>
        public static AQCSV Load(string csv, bool withMetaHader, string[] tablesRecordCount)
        {
            AQCSV ret = new AQCSV();

            if (string.IsNullOrEmpty(csv))
            {
                return(ret);
            }
            if (tablesRecordCount == null || tablesRecordCount.Length < 1)
            {
                return(ret);
            }
            ret.metaData = new AQCSVMetaData();
            ret.dataSet  = new AQCSVDataSet[tablesRecordCount.Length];
            int[] tablePoints     = new int[tablesRecordCount.Length];
            int[] tablePointsRead = new int[tablesRecordCount.Length];
            for (int i = 0; i < tablesRecordCount.Length; i++)
            {
                ret.dataSet[i] = new AQCSVDataSet();
                tablePoints[i] = tablePointsRead[i] = 0;
            }
            using (StringReader reader = new StringReader(csv))
            {
                string          line        = null;
                int             state       = 0; //0, meta header, 1, meta data, 2 data1 header, 3, data 1, 4 data2 header, 5, data 2 ....
                int             dataSection = 0;
                List <string[]> dateItems   = new List <string[]>();
                if (!withMetaHader)
                {
                    state = 2;
                }
                while ((line = reader.ReadLine()) != null)
                {
                    if (line.Length > 0)
                    {
                        if (state == 0)//meta header
                        {
                            ret.metaData.headers = CSVUtil.splitCCVLine(line);
                            ret.metaData.columns = ret.metaData.headers.Length;
                            state = 1;
                        }
                        else if (state == 1)//meta data
                        {
                            ret.metaData.datas = CSVUtil.splitCCVLine(line);
                            state = 2;
                            for (int i = 0; i < tablesRecordCount.Length; i++)
                            {
                                tablePoints[i] = int.Parse(ret.metaData[tablesRecordCount[i]]);
                            }
                        }
                        else
                        {
                            if (state % 2 == 0)//data header, oven state
                            {
                                ret.dataSet[dataSection].headers = CSVUtil.splitCCVLine(line);
                                ret.dataSet[dataSection].columns = ret.dataSet[0].headers.Length;
                                state++;
                            }
                            else//data, odd data
                            {
                                string[] dataItem = CSVUtil.splitCCVLine(line);
                                dateItems.Add(dataItem);
                                tablePointsRead[dataSection]++;
                                if (tablePointsRead[dataSection] == tablePoints[dataSection])
                                {
                                    ret.dataSet[dataSection].datas = dateItems.ToArray();
                                    dateItems.Clear();
                                    state++;
                                    dataSection++;
                                }
                            }
                        }
                    }
                }
                reader.Close();
            }
            return(ret);
        }
예제 #4
0
파일: AQCSV.cs 프로젝트: yanxuYX/examples
        public static AQCSVTable Load(string csv, string tblName, string countColumnName, ref int lineCount)
        {
            AQCSVTable ret = new AQCSVTable();

            ret.tblName = tblName;
            if (string.IsNullOrEmpty(csv))
            {
                return(ret);
            }
            ret.metaData = new AQCSVMetaData();
            ret.dataSet  = new AQCSVDataSet();
            using (StringReader reader = new StringReader(csv))
            {
                string          line       = null;
                int             curLineCnt = 0;
                int             dataNumber = 0;
                int             dataCount  = 0;
                int             state      = 0; //0, meta header, 1, meta data, 2 data header, 3, data
                List <string[]> dateItems  = new List <string[]>();
                while ((line = reader.ReadLine()) != null)
                {
                    curLineCnt++;
                    if (curLineCnt <= lineCount)
                    {
                        continue;
                    }
                    lineCount = curLineCnt;
                    if (line.Length > 0)
                    {
                        switch (state)
                        {
                        case 0:    //meta header
                        {
                            ret.metaData.headers = CSVUtil.splitCCVLine(line);
                            ret.metaData.columns = ret.metaData.headers.Length;
                            state = 1;
                            break;
                        }

                        case 1:    //meta data
                        {
                            ret.metaData.datas = CSVUtil.splitCCVLine(line);
                            if (!string.IsNullOrEmpty(countColumnName))
                            {
                                dataNumber = int.Parse(ret.metaData[countColumnName]);
                            }
                            state = 2;
                            break;
                        }

                        case 2:    //data header
                        {
                            ret.dataSet.headers = CSVUtil.splitCCVLine(line);
                            ret.dataSet.columns = ret.dataSet.headers.Length;
                            state = 3;
                            break;
                        }

                        case 3:    //data
                        {
                            string[] dataItem = CSVUtil.splitCCVLine(line);
                            dateItems.Add(dataItem);
                            dataCount++;
                            break;
                        }

                        default:
                            break;
                        }
                        if (dataNumber > 0 && dataCount == dataNumber) //move to next
                        {
                            lineCount++;
                            break;
                        }
                    }
                }
                reader.Close();
                ret.dataSet.datas  = dateItems.ToArray();
                ret.dataSet.length = ret.dataSet.datas.Length;
            }

            return(ret);
        }
예제 #5
0
        public RatingCurveResult LoadRatingCurve(RatingCurve curve, int stepPrecision, DateTimeOffset curveEffectiveTime)
        {
            var result = new RatingCurveResult();

            var curveCsv = HydroModel.GetExpandedRatingTable(
                curveEffectiveTime.UtcDateTime.ToOADate(),
                stepPrecision,
                CsvMetaHeader,
                CsvMetadata);

            if (string.IsNullOrEmpty(curveCsv))
            {
                return(result);
            }

            var csvRating = AQCSV.Load(curveCsv, true, new[] { "ExpandedPoints", "OriginalPoints" });

            var regularStages     = CSVUtil.ToDouble(csvRating.dataSet[0].datas, 0);
            var regularDischarges = CSVUtil.ToDouble(csvRating.dataSet[0].datas, 1);
            var shiftStages       = CSVUtil.ToDouble(csvRating.dataSet[0].datas, 2);
            var shiftDischarges   = CSVUtil.ToDouble(csvRating.dataSet[0].datas, 3);

            for (var i = 0; i < regularStages.Length; ++i)
            {
                result.ExpandedPoints.Add(new ExpandedPoint
                {
                    Stage            = regularStages[i],
                    Discharge        = regularDischarges[i],
                    ShiftedStage     = shiftStages[i],
                    ShiftedDischarge = shiftDischarges[i]
                });
            }

            var equationStages     = CSVUtil.ToDouble(csvRating.dataSet[1].datas, 0);
            var equationDischarges = CSVUtil.ToDouble(csvRating.dataSet[1].datas, 1);

            for (var i = 0; i < equationStages.Length; ++i)
            {
                result.EquationPoints.Add(new EquationPoint
                {
                    Stage     = equationStages[i],
                    Discharge = equationDischarges[i]
                });
            }

            var curveStartTime = curve.PeriodsOfApplicability.First().StartTime;
            var curveEndTime   = curve.PeriodsOfApplicability.Last().EndTime;

            var exceptions = GetRatingExceptions(curve.Id);

            var fieldVisitReadings = FieldVisitReadings.Where(r =>
            {
                var time = new DateTimeOffset(DateTime.SpecifyKind(r.MeasurementTime, DateTimeKind.Unspecified), TimeSpan.FromHours(r.UtcOffset));

                return(exceptions.IncludeIds.Contains(r.DiscreteMeasurementId) ||
                       !exceptions.ExcludeIds.Contains(r.DiscreteMeasurementId) && curveStartTime <= time && time < curveEndTime);
            }).ToList();

            var measurementIds = fieldVisitReadings
                                 .Select(f => f.DiscreteMeasurementId)
                                 .Distinct();

            result.RatingMeasurements = measurementIds
                                        .Select(id => CreateRatingMeasurement(fieldVisitReadings.Where(f => f.DiscreteMeasurementId == id).ToList()))
                                        .Where(r => r != null)
                                        .ToList();

            return(result);
        }