public static CovidRow FromCsv(string line)
        {
            string[] cols = line.Split(",");

            try
            {
                if (cols.Length == 6)
                {
                    string fips = cols[3];

                    string deaths = string.IsNullOrWhiteSpace(cols[5]) ? "0" : cols[5];

                    // county
                    var row = new CovidRow();
                    row.Date   = DateTime.Parse(cols[0]);
                    row.County = cols[1];
                    row.State  = cols[2];
                    row.Fips   = string.IsNullOrWhiteSpace(fips) ? 0 : Convert.ToInt32(fips);
                    row.Cases  = Convert.ToInt32(cols[4]);
                    row.Deaths = Convert.ToInt32(deaths);

                    return(row);
                }
                else
                {
                    string fips = cols[3];

                    var row = new CovidRow();
                    row.Date   = DateTime.Parse(cols[0]);
                    row.State  = cols[1];
                    row.Fips   = string.IsNullOrWhiteSpace(fips) ? 0 : Convert.ToInt32(fips);
                    row.Cases  = Convert.ToInt32(cols[3]);
                    row.Deaths = Convert.ToInt32(cols[4]);

                    return(row);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("CovidRow.FromCSV: EXCEPTION");
                Console.WriteLine(line);
                Console.WriteLine($"Exception message={e.Message}");

                throw;
            }
        }
        public Dictionary <string, State> Read(DateTime?onOrAfter = null)
        {
            string filename = _dataSetRetriever.GetFilename();

            try
            {
                var results = new List <CovidRow>();

                using var file = new StreamReader(filename);
                string line = file.ReadLine();

                while ((line = file.ReadLine()) != null)
                {
                    var row = CovidRow.FromCsv(line);

                    if (onOrAfter.HasValue)
                    {
                        bool check = row.Date.Date < onOrAfter.Value.Date;
                        if (check)
                        {
                            continue;
                        }
                    }

                    results.Add(row);
                }

                var states = new Dictionary <string, State>();

                foreach (var record in results)
                {
                    bool exists = states.TryGetValue(record.State, out var counties);
                    if (exists)
                    {
                        State state = states[record.State];

                        bool cExists = state.Counties.Exists(x => x.Fips == record.Fips);
                        if (cExists)
                        {
                            var c = state.Counties.Single(x => x.Fips == record.Fips);
                            c.Records.Add(new CovidDay {
                                Date = record.Date, Cases = record.Cases, Deaths = record.Deaths
                            });
                        }
                        else
                        {
                            var county = new County {
                                CountyName = record.County, Fips = record.Fips
                            };
                            county.Records.Add(new CovidDay {
                                Date = record.Date, Cases = record.Cases, Deaths = record.Deaths
                            });

                            state.Counties.Add(county);
                        }
                    }
                    else
                    {
                        var county = new County {
                            CountyName = record.County, Fips = record.Fips
                        };
                        county.Records.Add(new CovidDay {
                            Date = record.Date, Cases = record.Cases, Deaths = record.Deaths
                        });

                        var state = new State {
                            StateName = record.State
                        };
                        state.Counties.Add(county);

                        states.Add(record.State, state);
                    }
                }

                return(states);
            }
            finally
            {
                try
                {
                    Console.WriteLine("Deleting file...");
                    File.Delete(filename);
                    Console.WriteLine("Deleted file.");
                }
                catch (Exception e)
                {
                    Console.WriteLine($"Error deleting file. Message={e.Message}");
                }
            }
        }