🔥 Zapisy zamknięte, ale możesz pobrać Roadmapę .NET i dołączyć do listy oczekujących — Pobierz i dołącz do Listy VIP →

Tablica w C# — import danych z pliku CSV

Tablica – Importowanie danych z pliku

Ten artykuł to część 1 z 2 — kontynuacja znajduje się w Tablica w C# — import danych z pliku, cz. 2. Jeśli wolisz elastyczniejszą kolekcję zamiast tablicy o stałym rozmiarze, zobacz analogiczny import do listy.

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:repospopulation.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/

👨‍💻
Mariusz Jurczenko
Senior .NET Developer · 10+ lat doświadczenia komercyjnego

Programista .NET z doświadczeniem komercyjnym w firmach takich jak NFZ, Kamsoft, Diagnostyka, Hermes Reply Polska czy Etisoft Smart Solutions. Twórca kursów, z których skorzystało już ponad 11 000 osób w Strefie Kursów i ponad 1 000 kursantów na dev-hobby.pl.

Specjalizacja: Clean Code, Clean Architecture i uczenie programowania tak, żeby dało się je naprawdę zrozumieć — nie wykuć.

🚀 Co dalej?

Zobacz to w praktyce na wideo i pobierz darmową roadmapę, żeby ułożyć naukę w spójną ścieżkę do pierwszej pracy.

175 comments

  1. Hello! I could have sworn I’ve been to this blog before but after browsing through some of the post I realized it’s new to me. Anyways, I’m definitely happy I found it and I’ll be book-marking and checking back frequently!

  2. Hello! I could have sworn I’ve been to this blog before but after browsing through some of the post I realized it’s new to me. Anyways, I’m definitely happy I found it and I’ll be book-marking and checking back frequently!

  3. I’ve been surfing online greater than three hours as of late, yet I by no means found any fascinating article like yours. It¡¦s lovely value enough for me. In my view, if all site owners and bloggers made just right content as you probably did, the internet can be much more useful than ever before.

  4. Hi! This is my first visit to your blog! We are a group of volunteers and starting a new project in a community in the same niche. Your blog provided us useful information to work on. You have done a extraordinary job! Jackqueline Dov Rolfe

  5. After checking out a number of the blog posts on your website, I truly like your technique of blogging. I saved it to my bookmark website list and will be checking back in the near future. Please visit my web site too and tell me what you think. Tricia Jarrett Gazo

  6. It is appropriate time to make some plans for the future and it is time to be happy. I have read this post and if I could I want to suggest you few interesting things or suggestions. Perhaps you could write next articles referring to this article. I wish to read even more things about it! Katerina Osgood Guenna

  7. Today, while I was at work, my sister stole my iPad and tested to see if it can survive a thirty foot drop, just so she can be a youtube sensation. My iPad is now broken and she has 83 views. I know this is totally off topic but I had to share it with someone! Rachelle Cesaro Lach

  8. I do trust all of the ideas you have offered in your post. They are very convincing and will certainly work. Nonetheless, the posts are too quick for novices. May you please extend them a little from subsequent time? Thank you for the post. Darcy Ulrich Rives

  9. Undeniably believe that which you said. Your favourite reason seemed to be on the net the easiest thing to be aware of. I say to you, I certainly get annoyed at the same time as folks consider issues that they plainly do not know about. You controlled to hit the nail upon the top and outlined out the entire thing with no need side effect , people can take a signal. Will likely be back to get more. Thanks Lilllie Ravi Gaye

  10. I just could not go away your website before suggesting that I extremely loved the standard info a person provide in your visitors? Is gonna be back frequently in order to check out new posts Laurette Urbanus Jessy

  11. Hey there. I found your blog by way of Google while searching for a comparable topic, your website came up. It appears great. I have bookmarked it in my google bookmarks to visit then. Dominga Giff Margy

  12. Simply wish to say your article is as astounding. The clearness in your post is simply nice and i could assume you are an expert on this subject. Fine with your permission allow me to grab your RSS feed to keep updated with forthcoming post. Thanks a million and please carry on the gratifying work. Candis Judah Uzzial

  13. Jestem pod ogromnym wrażeniem twoich umiejętności pisania, a także układu twojego bloga. Czy to płatny motyw, czy też dostosowałeś go samodzielnie? Tak czy inaczej, zachowaj dobrą jakość pisania, dziś rzadko spotyka się świetny blog, taki jak ten.

  14. Bloguję dość często i naprawdę doceniam twoje informacje. Ten wspaniały artykuł naprawdę wzbudził moje zainteresowanie. Zamierzam dodać Twojego bloga do zakładek i sprawdzać nowe informacje raz w tygodniu. Zdecydowałem się również na Twój kanał RSS.

  15. Od razu pobiorę Twój kanał rss, ponieważ nie mogę znaleźć hiperłącza do subskrypcji e-mail lub usługi e-biuletynu. Czy masz jakieś? Proszę pozwolić mi zrozumieć, abym mógł zasubskrybować. Dzięki. Melisandra Peadar Procora

  16. Świetny blog! Dodatkowo Twoja strona internetowa działa bardzo szybko! Z jakiego hosta internetowego korzystasz? Czy mogę otrzymać hiperłącze partnerskie dla twojego hosta? Chciałbym, żeby moja strona ładowała się tak szybko, jak twoja lol Charlene Turner Feldt

  17. Hej, to świetny post. Czy mogę użyć jego części w mojej witrynie? Oczywiście podałbym link do Twojej witryny, aby ludzie mogli przeczytać cały artykuł, gdyby chcieli. Dzięki tak czy inaczej. Kata Darin Genisia

  18. Someone necessarily assist to make significantly posts I would state.
    That is the first time I frequented your website page and so far?
    I amazed with the research you made to make this particular submit incredible.

    Great task!

  19. Attractive section of content. I just stumbled upon your
    website and in accession capital to assert that I get in fact enjoyed account your blog posts.
    Anyway I’ll be subscribing to your augment and even I achievement you access consistently fast.

  20. Just desire to say your article is as astounding.
    The clarity to your submit is simply spectacular and i could think you’re a professional in this subject.
    Fine with your permission let me to grasp your feed to keep updated with coming near near post.
    Thank you a million and please carry on the enjoyable work.

Dodaj komentarz

czytanie to początek

Zamień wiedzę w umiejętności

Pobierz darmową Roadmapę .NET i ułóż takie tematy jak ten w spójną ścieżkę do pierwszej pracy.

Pobieram roadmapę →