/// <summary>Process the raw constant straight from the input file</summary> /// <remarks> /// The objective of this method is to parse the text in the /// specified constant and create a representative 'PatchVariable' /// </remarks> private void ProcessConstant(APSIMConstant constant) { // Parse examples: // longterm rain = 0 // longterm rain = patch_rain // longterm rain = rain from 2014-04-01 to 2014-07-31 if (constant.Name != "Title") { string descriptor = constant.Name + " = " + constant.Value; Console.WriteLine(" " + descriptor); string pattern = @"((?<longterm>longterm)\s+)?" + @"(?<variable>\S+)" + @"\s+=\s+" + @"(?<value>\S+)" + @"(" + @"(\s+from\s+)(?<date1>\S+)" + @"(\s+to\s+)(?<date2>\S+)" + @")?"; Regex r = new Regex(pattern); Match m = r.Match(descriptor); if (!m.Success) { throw new Exception("Invalid report variable found: " + descriptor); } GroupCollection c = r.Match(descriptor).Groups; bool longterm = c["longterm"].Value == "longterm"; string variableNameToSet = c["variable"].Value; string dataColumnName = c["value"].Value; string date1String = c["date1"].Value; string date2String = c["date2"].Value; DateTime date1; DateTime.TryParse(date1String, CultureInfo.InvariantCulture, DateTimeStyles.None, out date1); DateTime date2; DateTime.TryParse(date2String, CultureInfo.InvariantCulture, DateTimeStyles.None, out date2); string value = null; DataTable dataForConstant; if (data.Rows.Count > 0 && data.Columns.Contains(dataColumnName)) { dataForConstant = data; } else if (date1 != DateTime.MinValue && date2 != DateTime.MinValue) { dataForConstant = getDataFromInput(date1, date2); } else { // assume the data column name is actually a value. value = dataColumnName; dataColumnName = null; dataForConstant = null; } patchVariables.Add(new PatchVariable(variableNameToSet, dataColumnName, value, longterm, date1, date2, dataForConstant, Paddock)); } }
public void TestReadConstants() { WriteDummyMetFile(); APSIMInputFile InputFile = new APSIMInputFile(); InputFile.Open("test.met"); DataTable MetData = InputFile.ToTable(); InputFile.Close(); ArrayList Constants = InputFile.Constants; Assert.AreEqual(Constants.Count, 4); APSIMConstant Latitude = (APSIMConstant)Constants[0]; Assert.AreEqual(Latitude.Name, "Latitude"); Assert.AreEqual(Latitude.Value, "-27.11"); Assert.AreEqual(Latitude.Units, "deg min"); Assert.AreEqual(Latitude.Comment, "my latitude"); DeleteDummyMetFile(); }