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;
        }
Example #3
0
        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;
        }