/// <summary> /// /// </summary> /// <param name="reader"></param> /// <exception cref="XmlException.XmlException">Not parsing an xml file</exception> public void ReadXml(XmlReader reader) { try { reader.ReadStartElement(XmlTags.ListCases); while (reader.NodeType != XmlNodeType.EndElement) { AbstractCase c = null; switch (reader.LocalName) { case AmountCase.XMLNAME: c = new AmountCase(reader); break; case DateCase.XMLNAME: c = new DateCase(reader); break; case DescriptionCase.XMLNAME: c = new DescriptionCase(reader); break; case FixDescriptionCase.XMLNAME: c = new FixDescriptionCase(reader); break; case GrayUnaccessibleCase.XMLNAME: c = new GrayUnaccessibleCase(reader); break; case OkayCase.XMLNAME: c = new OkayCase(reader); break; case ReadonlyAmountCase.XMLNAME: c = new ReadonlyAmountCase(reader); break; } if (c == null) { throw new Exception("Parsing error. Are you sure the xml file is correct?"); } Add(c); } reader.ReadEndElement(); } catch (XmlException) { throw new XmlException("XmlException : You are not parsing an Xml file"); } }
public object Get(string id = "", string startdate = "", string enddate = "") { List <CovidSummaryData> summaryDatas = new List <CovidSummaryData>(); string message = "All Good."; if (!String.IsNullOrEmpty(id)) { //return "value"; DateTime dtStartDate = DateTime.MinValue; DateTime dtEndDate = DateTime.MinValue; if (startdate != "") { DateTime.TryParse(startdate, out dtStartDate); } if (enddate != "") { DateTime.TryParse(enddate, out dtEndDate); } if (dtStartDate != DateTime.MinValue && dtEndDate != DateTime.MinValue && dtStartDate > dtEndDate) { DateTime tmpEndDate = dtStartDate; dtStartDate = dtEndDate; dtEndDate = tmpEndDate; } bool ErrorsEncountered = false; var csv = new List <string[]>(); WebClient client = new WebClient(); string content = client.DownloadString("https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_US.csv"); string[] lines = content.Split(new string[] { Environment.NewLine, "\n" }, StringSplitOptions.None); //string[] lines = System.IO.File.ReadAllLines("https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_US.csv"); foreach (string line in lines) { csv.Add(line.Split(',')); } var properties = lines[0].Split(','); int CountyPos = 5; int StatePos = 6; int LatPos = 8; int LongPos = 9; int FirstDatePos = 11; //Quickly check that the fields are what we think. If not, we will need to devise some way to handle it if (properties[CountyPos] != "Admin2") { ErrorsEncountered = true; } if (properties[StatePos] != "Province_State") { ErrorsEncountered = true; } if (properties[LatPos] != "Lat") { ErrorsEncountered = true; } if (properties[LongPos] != "Long_") { ErrorsEncountered = true; } List <CovidData> listObjResult = new List <CovidData>(); for (int i = 1; i < csv.Count; i++) { if (csv[i].Length > 1 && (csv[i][CountyPos] == id || csv[i][StatePos] == id)) { CovidData objResult = new CovidData(); //for (int j = 0; j < properties.Length; j++) // objResult.Add(properties[j], csv[i][j]); objResult.County = csv[i][CountyPos]; objResult.State = csv[i][StatePos]; float lat = 0.0f; float.TryParse(csv[i][LatPos], out lat); objResult.Lat = lat; float longv = 0.0f; float.TryParse(csv[i][LongPos], out longv); objResult.Long = longv; int lastCaseNum = 0; List <DateCase> dateCases = new List <DateCase>(); for (int j = FirstDatePos; j < properties.Length; j++) { DateTime dt = new DateTime(); int CaseNum = 0; if (DateTime.TryParse(properties[j], out dt)) { if (int.TryParse(csv[i][j + 2], out CaseNum)) //Data contains commas ("county,state,us") so an offset is needed { if ((dt >= dtStartDate || dtStartDate == DateTime.MinValue) && (dt <= dtEndDate || dtEndDate == DateTime.MinValue)) { DateCase dateCase = new DateCase(); dateCase.CaseCount = CaseNum; dateCase.DataDate = dt; dateCase.NewCases = CaseNum - lastCaseNum; dateCases.Add(dateCase); } lastCaseNum = CaseNum; } else { ErrorsEncountered = true; } } else { ErrorsEncountered = true; } } objResult.DateCases = dateCases; listObjResult.Add(objResult); } } //var results = listObjResult.Where(a => a.Values.) List <CovidData> PreSummaryData = new List <CovidData>(); foreach (CovidData covidData in listObjResult.Where(a => a.County == id)) { PreSummaryData.Add(covidData); } List <DateCase> StateDateCases = new List <DateCase>(); foreach (CovidData covidData in listObjResult.Where(a => a.State == id)) { List <DateCase> dateCases = covidData.DateCases; foreach (DateCase dateCase in dateCases) { DateCase StateDateCase = StateDateCases.FirstOrDefault(a => a.DataDate == dateCase.DataDate); if (StateDateCase != null) { StateDateCase.CaseCount += dateCase.CaseCount; StateDateCase.NewCases += dateCase.NewCases; } else { DateCase newDateCase = new DateCase(); newDateCase.DataDate = dateCase.DataDate; newDateCase.CaseCount = dateCase.CaseCount; newDateCase.NewCases = dateCase.NewCases; StateDateCases.Add(newDateCase); } } } if (StateDateCases.Count > 0) { CovidData stateCovidData = new CovidData(); stateCovidData.State = id; stateCovidData.DateCases = StateDateCases; PreSummaryData.Add(stateCovidData); } foreach (CovidData covidData in PreSummaryData) { CovidSummaryData summaryData = new CovidSummaryData(); summaryData.County = covidData.County; summaryData.Lat = covidData.Lat; summaryData.Long = covidData.Long; summaryData.State = covidData.State; int minCases = -1; int maxCases = -1; int totalDays = 0; int sumNewCases = 0; DateTime MaxCasesDate = DateTime.MinValue; DateTime MinCasesDate = DateTime.MinValue; foreach (DateCase dateCase in covidData.DateCases) { if (dateCase.NewCases < minCases || minCases == -1) { MinCasesDate = dateCase.DataDate; minCases = dateCase.NewCases; } if (dateCase.NewCases > maxCases || maxCases == -1) { MaxCasesDate = dateCase.DataDate; maxCases = dateCase.NewCases; } sumNewCases += dateCase.NewCases; totalDays++; } summaryData.DateOfMaximumCases = MaxCasesDate; summaryData.MaximumCasesCount = maxCases; summaryData.DateOfMinimumCases = MinCasesDate; summaryData.MinimumCasesCount = minCases; summaryData.AverageDailyCases = Math.Round(sumNewCases * 1.0f / totalDays, 1); summaryDatas.Add(summaryData); } if (summaryDatas.Count == 0) { if (ErrorsEncountered) { message = "No Results found and errors encountered."; } else { message = "No Results found."; } } else { if (ErrorsEncountered) { message = "Errors Encountered."; } } } else { message = "No location provided"; } ReturnData retData = new ReturnData(); retData.Message = message; retData.Results = summaryDatas; return(Ok(retData)); }