Tablica – Importowanie danych z pliku

Tablica – Importowanie danych z pliku

Tematem tego wpisu będzie Importowanie danych z pliku, który zawiera informacje o populacji ludności w miastach wojewódzkich w Polsce. Dane te pochodzą z zewnętrznego pliku danych, pliku CSV, a nasz kod będzie musiał odczytać ten plik do tablicy aby nasza aplikacja mogła korzystać z tych danych i wyświetlić je na ekranie.

Na starcie nasza aplikacja po prostu wyświetli listę 7 najbardziej zaludnionych miast w Polsce w kolejności od najbardziej zaludnionego miasta. Zacznijmy!

Zaczynamy od utworzenia prostej klasy miasto, która to klasa będzie reprezentować pojedyncze miasto w Polsce. Napiszemy teraz potrzebny nam kod.

    public class City
    {
        public string CityName { get; }
        public string CityCode { get; }
        public string Country { get; }
        public int TotalPopulation { get; }
        public int MenPopulation { get; }
        public int WomenPopulation { get; }

        public City(string cityName, 
                    string cityCode, 
                    string country,
                    int totalPopulation, 
                    int menPopulation, 
                    int womanPopulation)
        {
            CityName = cityName;
            CityCode = cityCode;
            Country = country;
            TotalPopulation = totalPopulation;
            MenPopulation = menPopulation;
            WomanPopulation = womanPopulation;          
        }
    }

Co dzieje się w naszej klasie. Nie dzieje się tutaj nic niezwykłego. Nasza klasa miasto zawiera tylko właściwości do odczytu dla :
nazwy miasta, kodu miasta , państwa które są zadeklarowane jako stringi
i całkowitą populacje ludności i całkowitą populację mężczyzn i całkowitą populację kobiet zadeklarowaną jak int (liczba całkowita).

Konstruktor wymaga dostarczenia wszystkich tych informacji w czasie tworzenia instancji klasy, i klasa ta jest zasadniczo tylko workiem na dane tylko do odczytu.
Teraz utworzymy klasę CsvReader, które będzie obsługiwać odczyt pliku CSV.

    public class CsvReader
    {
        private string _csvFilePath;

        public CsvReader(string csvFilePath)
        {
            _csvFilePath = csvFilePath;
        }

        public City[] ReadFirstNCitys(int nCitys)
        {
            return null;
        }
     }

Klasa ta zawiera pole, które przechowuje ścieżkę do pliku danych CSV, i konstruktor, który oczekuje tej ścieżki do pliku, a następnie jest metoda nazwana ReadFirstNCitys.

Będzie to metoda, która importuje tyle miast z pliku ile chcemy. Jako parametr przyjmuje liczbą całkowitą, która mówi ile miast ma odczytać z pliku, i zwraca tablicę miast. I ta metoda nie została jeszcze skończona w tym momencie jest to pusta metoda która zwraca tylko null.

A użycie tej metody która zwraca null pokazuje ważną kwestię dotyczącą tablic.
Mimo całej ich unikalnej składni z nawiasami kwadratowymi, tablica jest całkowicie normalnym typem referencyjnym. Możemy traktować je tak jak każdy inny typ referencyjny i możemy ustawić ją na wartość null i możemy zwrócić ją z funkcji.

Przejdźmy teraz do głównej metody programu,  która kontroluje ogólną logikę aplikacji. Napiszemy teraz potrzebny nam kod.

static void Main(string[] args)
{
  string filePath = @"C:\repos\population.csv";

  CsvReader csvReader = new CsvReader(filePath);

  City[] citys = csvReader.ReadFirstNCiyts(7);

  foreach (var city in citys)
  {
     Console.WriteLine($"{city.TotalPopulation} : 
                         {city.CityCode} : 
                         {city.CityName}");
  }
}

Pierwszą rzeczą jaką tutaj robimy to jest ustawienie sciezki do pliku danych CSV.
Aby zachować prosty przykład, zakodujemy na stałe scieżkę do lokalizacji pliku w moim systemie a następnie tworzymy instancję klasy CsvReader.

Potem deklarujemy tablicę z miastami i tworzymy jej instancje ustawiając ją równą temu, co zwraca metoda ReadFirstNCitys. I przekazujemy do metody liczbe siedem ponieważ chcemy pobrać tylko siedem miast.

Następnie mam pętlę foreach, która służy do wyświetlenia wszystkich pobranych miast. I wyświetlam tylko populację całkowitą, kod miasta i nazwę miasta.

Jeśli sprubujesz teraz uruchomić aplikację, to ona nie zadziała dostaniemy wyjątek NullReferenceException w miejscu, w którym chcemy iterować nasze miasta z tablicy miast a to dla tego że nie mamy jeszcze zaimplementowanej metody ReadFirstNCitys która ma pobierać miasta z pliku w tej chwili metoda zwraca tylko null.

Nasza zmienna miasta zwraca null i gdy wchodzimy do pętli nie możemy iterować się po pustej kolekcji. Zmienna po której iterujemy w pętli musi mieć rzeczywiste wartości. Musimy więc zaimplementować metodę ReadFirstNCitys która ma pobierać miasta z pliku prawidłowo aby nie zwracała nulla. I to zrobimy już w kolejnym wpisie.

Całościowe omówienie tematu kolekcji (tablica, lista, kolejka, stos, słownik).
Wiele przydatnych wskazówek i dobrych praktyk dostępne jest na kursie:

https://dev-hobby.pl/kursy/c-wprowadzenie-do-kolekcji/

2 comments

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *