problem z try catch i brakujacymi danymi w pliku tekstowym

0

Witajcie ....Czy mial by ktos chec pomoc mi lub podpowiedziec (przykladem) .Jak zrobic zeby ten program ostrzegal mnei ze w pliku tekstowym brakuje czesci danych np.Mam plik w ktorym sa zapisane wyniki meczow w formacie .....team A : Team B : wynik A : wynik b....Udalo mi sie zrobic wyjatek jak nie ma pliku w ogole ale jak zrobic jesli na przyklad w pliku brakuje ktorejs druzyny lub wyniku w tej linijce czy tez tego separatora ktorym jest w tym przypadku dwukropek...Jestem w kropce nie wiem gdzie to zaczac .Probowalem uwzglednic If (splitArray[0] == " ") ale nie dzialalo ...pomoze ktos :musze uwzgednic bledy gdy nie ma druzyny a lub b ,gdy nie ma wyniku a lub b ,gdy separator jest inny ,badz jesli wyniki nie sa Intami.Dzieki za kazda pomoc

public static void main(String[] args) {

	    Scanner keyboard = new Scanner (System.in);

	    // Allow the user to enter the name of text file that the data is stored in
	    System.out.println("This program will try to read data from a text file ");
	    System.out.print("Enter the file name: ");
	    String filename = keyboard.nextLine();

	    Scanner fileReader = null;

	    //A list to add results to, so they can be printed out after the parsing has been completed.
	    ArrayList<LineResult> results = new ArrayList<>();

	    try {
	        File Fileobject = new File (filename);
	        fileReader  = new Scanner (Fileobject);

	        while(fileReader.hasNext()) {        
	            String line = fileReader.nextLine();// Read a line of data from text file

	            // this if statement helps to skip empty lines
	            if (line == "") {
	                continue;
	            }

	            String [] splitArray = line.split(":");
	            // check to make sure there are 4 parts in splitArray 
	            if(splitArray.length == 4) {
	                // remove spaces
	                splitArray[0] = splitArray[0].trim();
	                splitArray[1] = splitArray[1].trim();
	                splitArray[2] = splitArray[2].trim();
	                splitArray[3] = splitArray[3].trim();

	                //TODO: REQ3: Validate inputs better
	                if (splitArray[0] != splitArray[0].trim())
	                	System.out.println("error");
	                try {
	                    // Extract each item into an appropriate variable
	                    LineResult result = new LineResult();
	                    result.homeTeam = splitArray[0];
	                    result.awayTeam = splitArray[1];
	                    result.homeScore = Integer.parseInt(splitArray[2]);
	                    result.awayScore = Integer.parseInt(splitArray[3]);

	                    results.add(result);
	                } catch(NumberFormatException e) {
	                    System.out.println("Error: Cannot convert to number");
	                }     
	            }   
	        }

	        //Print out results
	        System.out.println("Home team       Score       Away team           Score");
	        System.out.println("=========       =====       =========       =====");

	        //Loop through each result printing out the required values.

	        //TODO: REQ4, filter results based on user requested team
	        for (LineResult result : results) {
	            System.out.println(
	            String.format("%-15s        %3s     %-15s       %3s",
	                    result.homeTeam,
	                    result.homeScore,
	                    result.awayTeam,
	                    result.awayScore));
	        }                   
	    // end of try block
	    } catch (FileNotFoundException e) {
	        System.out.println("Error - File does not exist");          
	    }
	}

	//Data object for holding a line result
	static class LineResult {
	    String homeTeam, awayTeam;
	    int homeScore, awayScore;}
	}

0

Jakiś regex sprawdzający poprawny format każdej linii? Jeżeli linia nie pasuje do wyrażenia wtedy puścić ostrzeżenie wraz z np. numerem linii i ją pominąć przy dalszym przetwarzaniu danych?

1

Zacznijmy od tego, ze w javie nie porównujemy obiektów przez ==, tzn porównujemy jeżeli chcemy sprawdzić czy jest to ten sam obiekt, ten sam adres w pamięci, a nie czy wartości tych obiektów są sobie równe
Tutaj już masz pierwszy błąd

if (line == "") {
  continue;
}

Jeżeli chcesz sprawdzić czy linia jest pusta powinieneś zrobić

if ("".equals(line)) {
    continue;
}

to samo do warunku który opisujesz w problemie splitAttay[0] == " " nie da Tobie oczekiwanego wyniku ponieważ nie sprawdzasz czy w elemencie tej tablicy jest " ", użyj metody equals.

0
Kermii napisał(a):

Zacznijmy od tego, ze w javie nie porównujemy obiektów przez ==, tzn porównujemy jeżeli chcemy sprawdzić czy jest to ten sam obiekt, ten sam adres w pamięci, a nie czy wartości tych obiektów są sobie równe
Tutaj już masz pierwszy błąd

if (line == "") {
  continue;
}

Jeżeli chcesz sprawdzić czy linia jest pusta powinieneś zrobić

if ("".equals(line)) {
    continue;
}

to samo do warunku który opisujesz w problemie splitAttay[0] == " " nie da Tobie oczekiwanego wyniku ponieważ nie sprawdzasz czy w elemencie tej tablicy jest " ", użyj metody equals.

Dzieki za odpowiedz .Cale to programowanie jest dla mnie nowoscia a moj nauczyciel sadzi ze wszyscy jestesmy nie wiem jak dobrzy .To jest moj drugi program w zyciu .
Czyli w czesci kodu gdzie mam sprawdzane czy linia ma 4 czesci pod tym czysto teoretyczie mogl bym napisac warunek dla kazdego elemntu tablicy

if(" ".equals(splitArray[0]))itd
{
System.out.println("brakuej np druzyny A");
}

bo musze uwzglednic kilka przypadkow :
-brak dr domowej,brak dr wyjazdowej ,brak wynikow,separator sie rozni ,badz wyniki nie sa intami.Zalaczylem plik do ktorego musze sie odniesc mam nadzieje ze mozesz go zobaczyc

0
Sebastian Goldyn napisał(a):

Czyli w czesci kodu gdzie mam sprawdzane czy linia ma 4 czesci pod tym czysto teoretyczie mogl bym napisac warunek dla kazdego elemntu tablicy

if(" ".equals(splitArray[0]))itd
{
System.out.println("brakuej np druzyny A");
}

Tak, mógłbyś tak zrobić...
Jeśli nie interesuje Cie w ogóle jakich danych brakuje, co z nimi jest nie tak itp to wystarczy Ci 1 pełny regex który sprawdzi czy format linijki się zgadza. Jeśli natomiast potrzebujesz te informacje (a rozumiem że tak) to musisz trochę więcej nad tym popracować.
Masz wyodrębnione przypadki jakie musisz sprawdzić:

-brak dr domowej,brak dr wyjazdowej ,brak wynikow,separator sie rozni ,badz wyniki nie sa intami.Zalaczylem plik do ktorego musze sie odniesc mam nadzieje ze mozesz go zobaczyc

Więc dodaj sobię metodę która przyjmuje jedną linijkę tekstu z pliku, np.
validRawLine(String line)

A w niej wywołuj po kolei metody sprawdzające każdy przypadek (dla każdego przypadku możesz np. zrobić metodę zwracającą true/false czy reguła jest spełniona).
Najpierw sprawdzasz czy separator jest poprawny i występuje tyle razy ile oczekujesz.
Potem sprawdzasz czy drużyna A i drużyna B jest wypełniona i czy mają dobry format (czy np. nie ma tam czegoś takiego: Liver8pool)
Potem sprawdzasz czy wyniki są wpisane i mają odpowiedni format.

Nie ma znaczenia czy zrobisz to na reggexach (na pewno byłoby czytelniej i krócej) ale jak to wyklepiesz ręcznie ze splitowaniem tych linijek to też będzie działać.

0
eL napisał(a):
Sebastian Goldyn napisał(a):

Czyli w czesci kodu gdzie mam sprawdzane czy linia ma 4 czesci pod tym czysto teoretyczie mogl bym napisac warunek dla kazdego elemntu tablicy

if(" ".equals(splitArray[0]))itd
{
System.out.println("brakuej np druzyny A");
}

Tak, mógłbyś tak zrobić...
Jeśli nie interesuje Cie w ogóle jakich danych brakuje, co z nimi jest nie tak itp to wystarczy Ci 1 pełny regex który sprawdzi czy format linijki się zgadza. Jeśli natomiast potrzebujesz te informacje (a rozumiem że tak) to musisz trochę więcej nad tym popracować.
Masz wyodrębnione przypadki jakie musisz sprawdzić:

-brak dr domowej,brak dr wyjazdowej ,brak wynikow,separator sie rozni ,badz wyniki nie sa intami.Zalaczylem plik do ktorego musze sie odniesc mam nadzieje ze mozesz go zobaczyc

Więc dodaj sobię metodę która przyjmuje jedną linijkę tekstu z pliku, np.
validRawLine(String line)

A w niej wywołuj po kolei metody sprawdzające każdy przypadek (dla każdego przypadku możesz np. zrobić metodę zwracającą true/false czy reguła jest spełniona).
Najpierw sprawdzasz czy separator jest poprawny i występuje tyle razy ile oczekujesz.
Potem sprawdzasz czy drużyna A i drużyna B jest wypełniona i czy mają dobry format (czy np. nie ma tam czegoś takiego: Liver8pool)
Potem sprawdzasz czy wyniki są wpisane i mają odpowiedni format.

Nie ma znaczenia czy zrobisz to na reggexach (na pewno byłoby czytelniej i krócej) ale jak to wyklepiesz ręcznie ze splitowaniem tych linijek to też będzie działać.

Nie umiem robic tego regexa w tym problem nie mialem nawet tego jescze w szkole .jak zapytalem nauczyciela to powiedzial mi tylko ze mam zrobic kombinacje try/catch i instrukcjii if

0

Nauczyciel sam pewnie tego jeszcze nie miał :D
A jeśli jest taka jego wola to nie ma problemu. Masz tam u góry w kodzie widziałem splitowanie linijki tekstu. Możesz tak robić. Zrób splita a potem sprawdzaj po kolei wszystko. Zresztą z tego co widze to już to przecież masz więc nie bardzo rozumiem gdzie masz problem? To co Ci aktualnie działa nie podaje które konkretnie wartości są błędne?

0
eL napisał(a):

Nauczyciel sam pewnie tego jeszcze nie miał :D
A jeśli jest taka jego wola to nie ma problemu. Masz tam u góry w kodzie widziałem splitowanie linijki tekstu. Możesz tak robić. Zrób splita a potem sprawdzaj po kolei wszystko. Zresztą z tego co widze to już to przecież masz więc nie bardzo rozumiem gdzie masz problem? To co Ci aktualnie działa nie podaje które konkretnie wartości są błędne?

A byla by szansa jesli wiesz jak zeby dac mi przyklad chocby jeden gdzie i jak to zrobic a reszte sprobuje sam ogarnac???

1 użytkowników online, w tym zalogowanych: 0, gości: 1