Wczytywanie z pliku.

Wczytywanie z pliku.
Q8
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 7 lat
  • Postów:12
0

Cześć,
napisałem metodę która wczytuje dane, na temat drużyn, zapisane w pliku .txt w formacie:
Nazwa
Liczba zwycięstw
Imię Zawodnika 1
Nazwisko Zawodnika 1
Imię Zawodnika 2
Nazwisko Zawodnika 2
pauza
Nazwa
Liczba zwycięstw
Imię Zawodnika 1
Nazwisko Zawodnika 1
Imię Zawodnika 2
Nazwisko Zawodnika 2
Imię Zawodnika 3
Nazwisko Zawodnika 3
pauza

Mój problem polega na tym, że drużyny mogą mieć różną liczbę zawodników. Dlatego dodałem "pauza", aby program wiedział, że jeśli pobierze takiego Stringa to ma przestać wczytywać dane zawodników i zacząć czytać dane kolejnej drużyny. Nie wiem gdzie jest błąd w moim kodzie.
Ps. Problemem jest także konwersja pobranej liczby zwycięstw, która jest Stringiem na typ int. Czy mogę to wykonać za pomocą Integer.valueOf()?

Kopiuj
public void OdczytDruzyny(String nazwa) throws FileNotFoundException{           
        try (Scanner odczyt = new Scanner(new File(nazwa))) {
            while(odczyt.hasNext()){               
                Druzyna tmp=new Druzyna();
                Druzyny.add(tmp);
                tmp.setNazwa(odczyt.nextLine());
                tmp.setPunkty(Integer.valueOf((odczyt.nextLine())));
                while(!(odczyt.hasNext("pauza"))){
                    Zawodnik tmpz= new Zawodnik();
                    tmpz.setImie(odczyt.nextLine());
                    tmpz.setNazwisko(odczyt.nextLine());
                    tmp.dodajZawodnika(tmpz);
                }
            }
        }
    }

Konsola:
Exception in thread "main" java.lang.NumberFormatException: For input string: "Jagielonia"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at java.lang.Integer.parseInt(Integer.java:615)
at Klasy.Gra.OdczytDruzyny(Gra.java:118)
at projekt.Projekt.main(Projekt.java:19)

edytowany 1x, ostatnio: qbacki890
0
  1. Proponuję zamienić "pauza" na ";" dla czystej estetyki.
  2. Najpierw wczytaj cały plik tekstowy, a nie operuj na strumieniu
  3. Za pomocą metody split podzielisz łańcuch przez separator
Kopiuj
String[] drozyny = zawartoscPliku.split(";");
Pieter24
  • Rejestracja:około 8 lat
  • Ostatnio:prawie 7 lat
  • Postów:90
0

Z tego co widzę to próbujesz zmienić Stringa "Jagielonia" na liczbę więc nie dziwne, że rzuca Ci błąd. Więc w miejscu, w którym pobierasz następną wartość wpada Ci coś złego, w tym wypadku słowo Jagielonia zamiast jakiejś liczby zapisanej jako String. Najłatwiej będzie jak ustawisz sobie tam breakpointa i zobaczysz czy czegoś nie pomijasz, przeskakujesz itp. Samą metodę do zmiany String na int masz dobrą i możesz to wykonać za pomocą Integer.valueOf(). Różnica miedzy valueOf() a parseInt() jest taka, że valueOf zwraca Integer a parseInt() typ prosty int

Kopiuj
Integer x = Integer.valueOf(str);
int y = Integer.parseInt(str);
edytowany 1x, ostatnio: Pieter24
Q8
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 7 lat
  • Postów:12
0
Wesoły Samiec napisał(a):
  1. Proponuję zamienić "pauza" na ";" dla czystej estetyki.
  2. Najpierw wczytaj cały plik tekstowy, a nie operuj na strumieniu
  3. Za pomocą metody split podzielisz łańcuch przez separator
Kopiuj
String[] drozyny = zawartoscPliku.split(";");

Ale w takiej sytuacji jak będę mógł oddzielić nazwę drużyny od zwycięstw i danych zawodników? Bo do podziału danych poszczególnych drużyn użyję split(";"), a reszta?
Mam jeszcze pytanie, w jaki sposób działa metoda hasNext(). Po prostu sprawdza kolejnego Stringa i zwraca true/false, ale nie "przechodząc" w pliku do kolejnej linii?

edytowany 1x, ostatnio: qbacki890
NE
Jak działa hasNext()? Sprawdzić raczej będzie ciężko :P W dokumentacji nawet nie ma tej metody
NE
  • Rejestracja:prawie 8 lat
  • Ostatnio:prawie 8 lat
  • Postów:2
1

Dla plain text i bez regexp:

  1. Proponuję trochę zmienić strukturę
    Grupa
Kopiuj
NAZWA_GRUPY;;ZWYCIESTWA;;UCZESTNIK 1;;UCZESTNIK N

Dane

Kopiuj
GRUPA_1\nGRUPA_N
  1. Parsować przykładowo możesz tak:
Kopiuj
String separatorGrupy = "\n";
    String separatorElementow = ";;";
    String wejscie = "Grupa1;;1;;Uczestnik 1\nGrupa2;;11;;Uczestnik 1;;Uczestnik N";
    
    for(String grupa : wejscie.split(separatorGrupy))
    	for(String element : grupa.split(separatorElementow)) {
    		
    		// Ciąg dlaszy parsowania
    		System.out.println(element); 
    	}
S9
  • Rejestracja:ponad 10 lat
  • Ostatnio:6 miesięcy
  • Lokalizacja:Warszawa
  • Postów:3573
0

A tak w ogóle to może lepiej użyć Apache Commsons? W sumie jak się uczysz to warto moze wiedzieć jak działa obsługa plikow w Javie, ale mozna nie pisać też tyle boilerplate kodu :P


"w haśle <młody dynamiczny zespół> nie chodzi o to ile masz lat tylko jak często zmienia się skład"
NE
Przypomniała mi się przygoda z apache.commons.io.FilenameUtils xD getExtension(".HiddenFileWithoutExtension") zwróciło HiddenFileWithoutExtension xD i wyszło że i tak muszę to sam napisać
V-2
  • Rejestracja:około 8 lat
  • Ostatnio:10 miesięcy
  • Postów:671
1
Wesoły Samiec napisał(a):
  1. Najpierw wczytaj cały plik tekstowy, a nie operuj na strumieniu
  2. Za pomocą metody split podzielisz łańcuch przez separator
Kopiuj
String[] drozyny = zawartoscPliku.split(";");

A jakby taki plik miał pół giga?


Nie ma najmniejszego powodu, aby w CV pisać "email" przed swoim adresem mailowym, "imię i nazwisko" przed imieniem i nazwiskiem, ani "zdjęcie mojej głowy od przedniej strony" obok ewentualnego zdjęcia. W drugiej firmie której już pracuję mam palących marihuanę programistów [...] piszą kod "leniwie", często nie wysilając się, rozwlekając ten kod, unikając np. programowania funkcyjnego (mówię tutaj o lambdach w javie).
NE
To mu wytłumacz overflow. To nie było przykazanie
Q8
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 7 lat
  • Postów:12
0

Dzięki wielkie za konkretne odpowiedzi. A zastosowanie apache commons w tak banalnym projekcie to chyba mija się z celem :D Chyba, że jest to szybkie, łatwe i przyjemne? :D

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.