Tablica – Importowanie danych z pliku cz.2

Tablica – Importowanie danych z pliku cz.2

Jeśli sprubujemy 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.

Przejdźmy zatem do metody ReadFirstNCitys i napiszmy potrzebny nam kod.

public City[] ReadFirstNCitys(int nCitys)
{
   City[] citys = new City[nCitys];

   using (StreamReader sr = new StreamReader(_csvFilePath))
   {
      sr.ReadLine();

      for (int i = 0; i < nCitys; i++)
      {
         string csvLine = sr.ReadLine();
         citys[i] = ReadCityFromCsvLine(csvLine);
      }
   }

   return citys;
}

Co tutaj robimy. Pierwsze tworzymy instancję tablicy miast dokładnie tylu ile przekazujemy w parametrze do metody. Następnie tworzymy instancję StreamReadera, który jest typem zapewnianym przez Microsoft do odczytu plików tekstowych.

StreamReadera jest w przestrzeni nazw System.IO. Musimy podać StreamReaderowi ścieżkę do pliku do odczytania, która jest przechowywana w polu csvFilePath

StreamReader ma metodę o nazwie ReadLine, która odczytuje kolejną linię tekstu z pliku i zwraca to, co jest odczytane jako string.

Pamiętaj, że pierwszy wiersz naszego pliku CSV to wiersz nagłówka, który możemy zignorować, więc po prostu wywołuję ReadLine, ale nie robię nic z wynikiem.

Potem mamy pętlę „for”, aby przeczytać, tyle miast ile jest przekazane w parametrze nCitys. Za każdym razem w pętli pobieram następny wiersz z pliku za pomocą StreamReader.ReadLine(), a następnie analizuję ten wiersz w metodzie ReadCityFromCsvLine() której jeszcze nie mamy i zaraz ją napiszemy, aby parsować pojedynczą linię z pliku do instancji miasta. I na koniec metoda zwraca tablicę miast.

Ponieważ każda linia / wiersz pliku CSV zawiera dane dla jednego miasta, oczywistym krokiem w importowaniu pliku danych będzie konwersja pojedynczej linii z pliku do instancji jednego miasta.

Napiszmy teraz metodę ReadCityFromCsvLine() aby to zrobić.

public City ReadCityFromCsvLine(string csvLine)
{
   string[] parts = csvLine.Split(',');

   string cityName = parts[0];
   string cityCode = parts[1];
   string country = parts[2];
   int totalPopulation = int.Parse(parts[3]);
   int menPopulation = int.Parse(parts[4]);
   int womanPopulation = int.Parse(parts[5]);

   return new City(cityName, cityCode, country, totalPopulation, menPopulation, womanPopulation);
}

Metoda jako argument przyjmuje ciąg znaków, który będzie zawartością wiersza pliku i zwraca instancję miasta, którą odczytaliśmy z linii pliku csv. Więc jaka jest tutaj logika?

Bardzo Prosta. Każda linia pliku CSV zawiera nazwę miasta, kod, kraj, całkowita populacja tego miasta, populacja menzczyzn tego miasta, populacja kobiet tego miasta, oddzielone przecinkami, więc ta metoda musi podzielić ciąg, który został odczytany wszędzie tam, gdzie zawiera przecinek, abyśmy otrzymali sześć oddzielnych ciągów, reprezentujących parametry wymagane przez konstruktor miasta.

I dokładnie to robi ta metoda, string.Split(). Jest to metoda do stringów, którą Microsoft udostępnił do dzielenia stringów i tutaj doskonale pasuje do naszych celów. Metoda split analizuje coś, co wygląda jak pojedynczy przecinek.
Argument mówi metodzie Split, który znak będzie separatorem, czyli znakiem oddzielającym pola. W tym przypadku separatorem jest przecinek, ale w innym scenariuszu może to być znak tabulacji lub średnik i tak dalej.
Split podzieli ciąg, gdziekolwiek zobaczy znak separatora, i zwróci wynik, i tutaj jest interesująca rzecz.

To, co zwraca, to jest tablica ciągów. Widzisz, string.Split pobiera jeden duży ciąg i zwraca potencjalnie wiele mniejszych ciągów. Jak inaczej może zwrócić wiele innych ciągów niż w kolekcji. Kolekcje są wszędzie. Teraz jest łatwo.

Tablica zwrócona przez string.Split będzie zawierać szesc stringów odpowiadających każdej kolumnie w każdej linii CSV. Pierwsza część to miaso, druga to kod, trzecia to kraj,a czwarta to całkowita populacja tego miasta i tak dalej…

Oczywiście dostęp do tych danych uzyskujemy przy użyciu składni nawiasu kwadratowego i pamiętamy, że tablica jest indeksowana do zera. I musimy przekonwertować wszystkie populację na liczbę całkowitą i dla bezpieczeństwa używamy int.parse, co spowoduje zgłoszenie wyjątku, jeśli z jakiegokolwiek powodu te pola nie mogą zostać przeanalizowane jako liczba całkowita.

Proste, co?  Właściwie ten kod jest zbyt prosty.

Jeszcze potrzebujemy pliku population.csv

City Name,City Code,Country,Total population,Men population,Women population
Mazowieckie,MAZ,Polska,5411446,2589469,2821977
Slaskie,SLA,Polska,4524091,2180662,2343429
Wielkopolskie,WLK,Polska,3495470,1700647,1794823
WielkopolskieTest,WLK,Polska,3495470,1700647,1794823
Malopolskie,MLP,Polska,3404863,1652663,1752200
Dolnoslaskie,DOL,Polska,2899986,1394399,1505587
Lodzkie,LDZ,Polska,2460170,1172228,1287942
LodzkieTest,LDZ,Polska,2460170,1172228,1287942
PomorskieTest,POM,Polska,2337769,1138351,1199418
Pomorskie,POM,Polska,2337769,1138351,1199418
Podkarpackie,PKR,Polska,2127462,1041890,1085572
Lubelskie,LBL,Polska,2112216,1023626,1088590
Kujawsko-pomorskie,K-P,Polska,2074517,1005361,1069156
Zachodniopomorskie,ZPM,Polska,1698344,825659,872685
Warminsko-mazurskie,W-M,Polska,1425967,697504,728463
Swietokrzyskie,SWI,Polska,1237369,603304,634065
Podlaskie,PDL,Polska,1179430,574786,604644
Lubuskie,LBU,Polska,1013031,492984,520047
Opolskie,OPO,Polska,984345,476017,508328

I teraz doszliśmy do końca i możemy uruchomić nasz program!

Już prawie skończyliśmy, ale jest jeszcze jedna ostatnia rzecz, którą chcę rozwiązać.
Sposób wyświetlania tych populacji jest okropny do odczytania. Ludność Mazowieckiego wynosi w rzeczywistości 5,4 miliona, ale to, co jest tutaj wyświetlane, wygląda jak jedna duża liczba. Musisz się naprawdę skoncentrować, aby dowiedzieć się, jakie są te populacje, więc sformatujmy trochę ten wynik.

Console.WriteLine($"{city.TotalPopulation:### ### ###} : {city.CityCode} : {city.CityName}");

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/


89 comments

  1. I read a great article with pleasure, I hope it will continue Sib Corbie Brandie

  2. Here is a great Weblog You might Come across Interesting that we Encourage You Elaine Rodger Friedly

  3. we prefer to honor several other net web-sites around the web, even if they arent linked to us, by linking to them. Under are some webpages really worth checking out Darcy Scottie Geer

  4. Only wanna state that this is extremely helpful, Thanks for taking your time to write this. Genia Udell Branca

  5. Hi, i read your blog occasionally and i own a similar one and i was just curious if yyou get a lot of spam responses? Darda Thorpe Ferro

  6. Wow! After all I got a blog from where I be able to genuinely take useful data concerning my study and knowledge. Melodie Shelby Kidd

  7. whoah this weblog is excellent i love reading your posts. Keep up the good work! You understand, many individuals are searching round for this information, you can aid them greatly. | Meta Jory Huber

  8. I would like to thank you for the efforts you have put in writing this blog. I am hoping the same high-grade website post from you in the upcoming as well. In fact your creative writing abilities has inspired me to get my own web site now. Really the blogging is spreading its wings quickly. Your write up is a great example of it. Britteny Clem Fidel

  9. Excellent beat ! I wish to apprentice while you amend your website, how could i subscribe for a blog site? The account helped me a acceptable deal. I had been tiny bit acquainted of this your broadcast provided bright clear concept Gene Hamel Subak

  10. Hiya, I am really glad I have found this information. Today bloggers publish only about gossip and web stuff and this is actually irritating. A good website with exciting content, that is what I need. Thank you for making this website, and I will be visiting again. Do you do newsletters by email? Sophey Booth Shull

  11. I have been checking out some of your articles and i can state pretty nice stuff. I will surely bookmark your site. Melli Aloysius Usanis

  12. Hi there to every one, the contents existing at this website are really amazing for people experience, well, keep up the good work fellows. Sandy Alon Joey

  13. Wonderful post! We are linking to this great post on our website. Keep up the great writing. Robyn Boy Barcellona

  14. Członkowie rodziny zawsze mówią, że zabijam
    mój czas tutaj w sieci, z wyjątkiem tego, że wiem, że codziennie rozwijam znajomość, czytając takie dobre artykuły lub recenzje.

  15. Właściwie to zgadzam się z Tobą mam jednak małe ale… Bądź, Trwaj i pisz dalej, a krytyką nie przejmuj się wcale.

  16. Twój sposób rozwiązania tego problemu jest naprawdę efektywny. Dzięki za dzielenie się takimi praktycznymi wskazówkami

  17. Bardzo podoba mi się, że zawsze dostosowujesz poziom trudności do różnych czytelników. To sprawia, że nawet osoby początkujące mogą z łatwością zrozumieć temat

  18. Twoje artykuły są dla mnie niezastąpionym źródłem wiedzy. Zawsze znajduję tu coś nowego i ciekawego.

  19. Dzięki za podzielenie się swoim doświadczeniem w [temat]. To zawsze wartościowa perspektywa, zwłaszcza dla tych, którzy chcą się rozwijać w tej dziedzinie

  20. Bardzo doceniam, jak skupiasz się na zrozumieniu fundamentów. To rzadkość wśród blogów, a jednocześnie kluczowe dla solidnego rozwoju jako programisty

  21. Jestem pewien, że wielu ludzi skorzysta z tego artykułu

  22. Podoba mi się, jak dbasz o każdy szczegół. To sprawia, że czytanie Twoich artykułów jest przyjemnością

  23. Masz dar do motywowania innych do nauki i eksperymentowania. Świetne!

  24. Twój sposób myślenia naprawdę mnie inspiruje. Dzięki za dzielenie się swoją perspektywą

  25. Twój artykuł zawsze daje mi kopa do działania. Dzięki za to

  26. Wspaniały artykuł! Jesteś prawdziwym ekspertem w temacie, dzieki

  27. To jest dokładnie to, czego szukałem. Bardzo praktyczne i konkretne porady.

  28. Czy masz jakieś plany na napisanie więcej na temat konkretnego tematu w przyszłości

  29. Jestem pod wrażeniem Twojego doświadczenia w dziedzine

  30. Ciekawy punkt widzenia. Wartościowe spojrzenie na temat

  31. Bardzo podoba mi się, jak eksplorujesz [temat] z różnych perspektyw

  32. Masz zdolność tłumaczenia skomplikowanych koncepcji na prosty język. Świetne

  33. Fantastyczny artykuł! Znacznie mi pomógł w zrozumieniu tematu

  34. Cieszę się, że natknąłem się na ten artykuł. Precyzyjne i zwięzłe wyjaśnienia

  35. Twoje doświadczenie widać w każdym zdaniu. Inspirujące

  36. Dzięki za zainspirowanie mnie do pogłębiania wiedzy w temacie.

  37. Ten artykuł sprawił, że temat stał się znacznie mniej przerażający.

  38. Nie mogę się doczekać, aż napiszesz kolejny artykuł , SUPER

  39. Dzięki za podzielenie się swoim doświadczeniem. To zawsze inspirujące czytać o realnych wyzwaniach i sposobach ich pokonywania

  40. Cieszę się, że trafiłem/am na ten blog. Zawsze tu znajduję interesujące treści i rozwijam swoją wiedzę

  41. Znalazłem/am dokładnie to, czego szukałem/a. Twój artykuł bardzo mi pomógł/a w zrozumieniu pewnych kwestii.

  42. Wartościowy przegląd tematu. Zawsze doceniam, gdy ktoś potrafi spojrzeć na problem z różnych perspektyw

  43. Ciekawy artykuł! Masz dar tłumaczenia trudnych koncepcji na prosty język, co sprawia, że nauka jest przyjemnością

  44. Zauważyłem, że regularnie dodajesz wartościowe treści na ten blog. Dzięki za to, zawsze tu wracam po ciekawe informacje

  45. Bardzo klarowny artykuł! Świetnie tłumaczy zagadnienia nawet dla początkujących

  46. Doskonały artykuł! Bardzo jasne wyjaśnienia, nawet dla początkujących programistów.

  47. Zawsze czekam na nowe treści od Ciebie. Kontynuuj świetną pracę!

  48. Fajnie, że poruszyłeś zarówno podstawy, jak i bardziej zaawansowane tematy. To sprawia, że jest to przydatne dla różnych czytelników.

  49. Cieszę się, że poruszyłeś ten temat. Niewielu blogerów skupia się na tym aspekcie, a jest to naprawdę istotne

  50. Bardzo podoba mi się sposób, w jaki organizujesz treść. To sprawia, że łatwiej jest zrozumieć całą koncepcję

  51. Ten post idealnie wpasowuje się w moje obecne wyzwanie programistyczne. Dzięki za inspirację!

  52. Super, że zaznaczyłeś potencjalne problemy i przedstawiłeś rozwiązania. To oszczędza wiele czasu

  53. Dzięki za podzielenie się tymi wskazówkami. Są one zawsze przydatne niezależnie od tego, jak zaawansowany jesteś

  54. Doskonały artykuł! Bardzo jasne wyjaśnienia, nawet dla początkujących programistów

  55. Świetny artykuł! Zawsze ciekawie czytać o nowych rozwiązaniach i najlepszych praktykach w świecie programowania

  56. Świetnie, że poruszyłeś [konkretny temat]. Często jest pomijany, a tu masz świetne podejście. Gratulacje

  57. Podoba mi się, jak zrównoważony jest ten artykuł – zarówno dla początkujących, jak i bardziej zaawansowanych programistów. Wartościowa lektura

  58. Doskonałe rozwiązanie problemu. Niezależnie od tego, czy jesteśmy nowicjuszami, czy doświadczonymi programistami, zawsze warto znać takie triki. Dzięki!

  59. Ciekawe podejście do tematu. Z pewnością przyda mi się to w mojej pracy. Dzięki za inspirację!

  60. Świetny artykuł! Bardzo dobrze wytłumaczone i łatwe do zrozumienia. Dzięki za podzielenie się tą wiedzą

  61. Dzięki za to, że jesteś częścią społeczności programistycznej i dzielisz się swoją wiedzą. Doceniam to!

  62. Bardzo inspirujący post. Motywuje mnie do dalszego rozwoju jako programisty

  63. Świetne przykłady i ilustracje. Dzięki nim łatwiej jest zrozumieć omawiany temat

  64. Twoje wpisy zawsze dostarczają wartościowej treści. Dzięki za to!”

  65. Ciekawy temat! Zawsze jestem głodny nowej wiedzy z zakresu programowania.

  66. Dzięki za udostępnienie tego zasobu. To na pewno pomoże wielu osobom

  67. Brawo za kolejny fantastyczny artykuł! Zawsze warto śledzić ten blog, aby być na bieżąco z nowinkami w świecie programowania.

  68. Twoje podejście do [tematu] jest bardzo praktyczne. Bardzo pomocne dla tych, którzy chcą wprowadzić te rozwiązania w życie.

  69. Cieszę się, że ktoś wreszcie poruszył ten temat. Mam nadzieję, że więcej osób zacznie go uwzględniać w swoich projektach

  70. Mam wrażenie, że nawet doświadczeni programiści mogą znaleźć tu coś nowego do nauki. Świetna robota

  71. super, że zdecydowałeś się poruszyć ten temat. Często brakuje porad dotyczących importowania danych z pliku w dostępnych materiałach

  72. Dzięki za udostępnienie swojego doświadczenia. Często brakuje realnych przykładów, a twój artykuł jest pełen praktycznych wskazówek

  73. Aeroport transfers from st tropez pisze:

    Czy rozważałeś/łaś napisanie kolejnego artykułu na temat [temat związany]? Myślę, że mógłbyś/mogłabyś dostarczyć cenne spojrzenie na ten temat

  74. Cieszę się, że istnieją tacy pasjonaci jak Ty, którzy dzielą się swoją wiedzą. Dzięki za inspirację

  75. Best hair transplant in Istanbul pisze:

    Jestem pod wrażeniem Twojego doświadczenia

  76. Akika Kurbanı Nedir? Akika Kurbanı Ne Zaman Kesilir? pisze:

    Masz zdolność tłumaczenia skomplikowanych koncepcji na prosty język. Świetne

  77. VPS SERVER
    Высокоскоростной доступ в Интернет: до 1000 Мбит/с
    Скорость подключения к Интернету — еще один важный фактор для успеха вашего проекта. Наши VPS/VDS-серверы, адаптированные как под Windows, так и под Linux, обеспечивают доступ в Интернет со скоростью до 1000 Мбит/с, что гарантирует быструю загрузку веб-страниц и высокую производительность онлайн-приложений на обеих операционных системах.

  78. https://medium.com/@weber_jael77823/сервер-для-д-b26ccaab4041
    VPS SERVER
    Высокоскоростной доступ в Интернет: до 1000 Мбит/с
    Скорость подключения к Интернету — еще один важный фактор для успеха вашего проекта. Наши VPS/VDS-серверы, адаптированные как под Windows, так и под Linux, обеспечивают доступ в Интернет со скоростью до 1000 Мбит/с, что гарантирует быструю загрузку веб-страниц и высокую производительность онлайн-приложений на обеих операционных системах.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *