private void GetLocales(IEnumerable<string> localeLines, CovidMasterData masterData) { List<string> locales = new List<string>(); List<string> countries = new List<string>(); foreach(string localeLine in localeLines) { TextFieldParser parser = new TextFieldParser(new StringReader(localeLine)); parser.HasFieldsEnclosedInQuotes = true; parser.SetDelimiters(","); string[] fields; while (!parser.EndOfData) { fields = parser.ReadFields(); string localeField = fields[0].Replace(",", "").Replace("'", ""); if (!locales.Contains(localeField)) { locales.Add(localeField); } if (!countries.Contains(fields[1])) { countries.Add(fields[1]); } } } masterData.Countries = countries; masterData.Locales = locales; }
public async Task<CovidMasterData> GetAllCovidData() { CovidMasterData data = await GetCaseData("Confirmed", null); await GetCaseData("Deaths", data); await GetCaseData("Recovered", data); data.GenerateCountryData(); data.Trim(); return data; }
public async Task GetWebData() { CovidDataService service = new CovidDataService(); CovidMasterData data = await service.GetCaseData("Confirmed", null); await service.GetCaseData("Deaths", data); await service.GetCaseData("Recovered", data); data.GenerateCountryData(); Assert.IsTrue(data.LocaleData.Count > 100); }
public async Task<CovidMasterData> GetCaseData(string status, CovidMasterData masterData) { bool isNew = false; if (masterData == null) { isNew = true; masterData = new CovidMasterData(); } var lines = await GetCsvData(status); if (isNew) { string headerRow = lines[0]; List<string> dates = headerRow.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList(); dates.RemoveRange(0, 4); masterData.Dates = dates.Skip(dates.Count - 21).ToList(); GetLocales(lines.Skip(1), masterData); } List<CovidDataPoint> localeData = new List<CovidDataPoint>(); foreach(string line in lines.Skip(1)) { try { TextFieldParser parser = new TextFieldParser(new StringReader(line)); parser.HasFieldsEnclosedInQuotes = true; parser.SetDelimiters(","); string[] fields; while (!parser.EndOfData) { fields = parser.ReadFields(); string localeField = fields[0].Replace(",", "").Replace("'", ""); List<int> counts = fields.ToList().Skip(4).Select(int.Parse).ToList(); List<int> dailyCounts = new int[counts.Count].ToList(); CovidDataPoint point = new CovidDataPoint(localeField.Replace(",", ""), fields[1]); if (!isNew) { point = masterData.Get(localeField, fields[1]); } for (int i = 0; i < counts.Count; i++) { if (i == 0) { dailyCounts[i] = 0; } else { dailyCounts[i] = counts[i] - counts[i - 1] < 0 ? 0 : counts[i] - counts[i - 1]; } } switch (status) { case "Confirmed": point.NumConfirmed = counts.Skip(counts.Count - 21).ToList(); point.DailyNewCases = dailyCounts.Skip(dailyCounts.Count - 21).ToList(); break; case "Deaths": point.NumDeaths = counts.Skip(counts.Count - 21).ToList(); point.DailyNewDeaths = dailyCounts.Skip(dailyCounts.Count - 21).ToList(); break; case "Recovered": point.NumRecovered = counts.Skip(counts.Count - 21).ToList(); break; default: break; } localeData.Add(point); } } catch (Exception ex) { var a = ex; throw; } } masterData.LocaleData = localeData; return masterData; }