Twitter: @grzegg
Kategoria: java, Tagi: - - - .

Java [35] – Zapis i odczyt plików tekstowych, pliki CSV

Programy pracujące z danymi zazwyczaj muszą mieć możliwość ich odczytywania i zapisywania na dysku. Najbardziej podstawowym sposobem zapisu danych są odpowiednio sformatowane pliki tekstowe. Mają one także tą zaletę, że są uniwersalne, można je odczytać na wielu programach, włączając w to edytory tekstu.

Zapis prostej informacji do pliku tekstowego

Najpierw pokażę jak zapisać kilka linijek tekstu do pliku a następnie je odczytać. Sposobów zapisu informacji do plików jest kilka, zaczniemy od „tradycyjnego”. Poniższy program zawiera metodę, w której znajduje się kod zapisujący trzy linijki mające po jednym słowie (możesz dopisać ich więcej) do pliku, metodę która ten plik odczytuje i metodę main(), która wywołuje te metody a także wypisuje na ekranie odczytany tekst. Komentarze w kodzie wyjaśniają kolejne operacje.

Zauważ, że w powyższym kodzie użyliśmy obiekt typu PrintWriter, który po linijce zapisywał tekst do pliku, natomiast do odczytu posłużył nam stary znajomy Scanner, który tym razem jako argument konstruktora otrzymał obiekt typu File, w efekcie odczytywał dane z pliku zamiast z klawiatury (jak robił to w poprzednich programach). Po zapisie danych do pliku plik należało zamknąć. Nie jest to konieczne jeśli wykorzystamy nowsze rozwiązania dostępne w Javie, co pokażę w kolejnym przykładzie.

Zapis danych w formacie CSV

W drugim przykładzie pokażę jak użyć nowszych mechanizmów zapisu plików a przy okazji zapoznamy się z formatem CSV. Jest to chyba najprostszy format służący zapisaniu danych. W standardowej formie są to rzędy danych poprzedzielanych przecinkami, stąd nazwa CSV (ang. Comma Separated Values) i zwyczajowe przedłużenie nazw pliku: .csv. Na przykład taki plik może wyglądać tak:


2.3, 2.2, 2.1, 2.0, 1.8
2.2, 2.1, 2.1, 2.3, 2.0
2.2, 2.2, 2.1, 1.9, 1.8

Jak widać, te dane można by łatwo przedstawić w formie tabelarycznej, gdzie rząd danych odpowiadałby rzędowi w tabeli a kolejna liczba w rzędzie byłaby przyporządkowana do kolejnej kolumny. W praktyce można zamiast przecinka wybrać inny znak, np. średnik czy hasz, jeśli chcemy przechowywać liczby zmiennoprzecinkowe w przyjętej m. in. w Polsce notacji z przecinkiem zamiast kropki. Często stosuje się znak tabulatora co dodatkowo może zwiększać czytelność pliku. W tym ostatnim przypadku mówimy raczej o plikach TSV (ang. Tab Separated Values). Jeśli dane pole zawiera tekst, zwłaszcza jeśli jest on dłuższy i zawiera znaki separatora to można go zamknąć w parze cudzysłowów. Trzeba oczywiście wtedy zadbać, żeby program, który odczytuje taki plik to uwzględnił i potraktował np. przecinek w obrębie tekstu jako jego element a nie znak separatora.

Poniższy kod tworzy tablicę dwuwymiarową liczb double z powyższymi danymi, zapisuje je w pliku dane.csv, który znajdziesz po uruchomieniu programu w katalogu z projektem a następnie odczytuje ten plik i odtwarza tablicę z liczbami typu double. Oczywiście dane w pliku tekstowym zapisywane są jako łańcuchy znaków a muszą przy odczycie zostać przekonwertowane na liczby double.

W tym przykładzie pokazałem ja użyć sposobu zapisu pliku dostępnych w nowszych wydaniach Javy. Wykorzystują one m. in. klasy Path i Files, które oferują wiele użytecznych metod statycznych służących do pracy z plikami i katalogami, ale nie będziemy ich tu szerzej omawiać, przynajmniej na razie.

Bardziej złożony przykład danych zapisanych w pliku CSV

Plik CSV może zawierać dane różnego rodzaju, niekoniecznie liczbowe a także może zawierać linię z nagłówkami, co zobaczymy w kolejnym przykładzie. Tym razem dane będą miały bardziej złożony charakter, tym razem punktem wyjścia będzie istniejący plik z danymi zawierającymi liczby chromosomów roślin.

Plik zawiera numer porządkowy, nazwę rodzaju, nazwę gatunkową, liczbę 2n chromosomów i liczbę x chromosomów. Pierwsza linia zawiera nagłówki.
Projekt będzie się składał z dwu plików: głównego, zawierającą metodę main() pliku DaneZlozone.java oraz klasy Takson.java. Obiekty typu Takson będą przechowywały informacje dotyczące poszczególnych taksonów. Dane odczytane z jednej linii, będą umieszczane w poszczególnych polach obiektu. Kolejne obiekty Takson będą umieszczane w liście (w klasie DaneZlozone).

Klasa DaneZlozone.java, poza metodą main(), zawiera metody służące do odczytu danych, wyświetlania menu i pobrania decyzji użytkownika, dodania nowego rekordu, usunięcia rekordu, wypisania danych oraz oddzielną metodę, która będzie dokonywać konwersji danych z listy String-ów do listy obiektów. Będzie on pobierać po linii z listy a następnie oddzielać poszczególne pola, dokonywać ich konwersji do liczb kiedy to koniecznie a w końcu ustawiać je jako wartości pól w obiektach, które skolekcjonuje w liście obiektów Takson.

Plik: dane_chromosomy.csv

Umieść powyższą treść w pliku i zapisz go np. pod nazwą dane_chromosomy.csv na dysku, najlepiej w miejscu do którego nie prowadzi zbyt długa ścieżka (np. bezpośrednio w katalogu użytkownika), ponieważ będzie trzeba ją ręcznie wpisać po uruchomieniu programu.
Pobierz plik: dane_chromosomy.csv (821 pobrań )

Plik: Takson.java

Plik: DaneZlozone.java

Zadanie

Uzupełnij powyższy program o metodę, która umożliwi wyszukiwanie rodzajów lub gatunków w zestawie danych.

Leave a Reply