• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[JAVA] Wczytywanie danych z pliku.txt- dziwny problem.

0 głosów
1,313 wizyt
pytanie zadane 11 maja 2017 w Java przez embid123 Użytkownik (630 p.)

Witam, standardowo przy wczytywaniu pliku używam BufferedReadera z FileReaderem. Proces wczytywania danych przebiega u mnie w 2 etapach: w pierwszym ustalam wymiary macierzy, w drugim wpisuję elementy do macierzy. Fragment pliku: 

 

Type,Food Name,Calories,Protein,Fat,Carbohydrates,Calcium,Iron,Sodium,Vitamin A,Thiamin,Vitamin C
Cheese,American cheese,420,26.5,34.0,2.1,790,0.8,1291,1387,0.04,0
Juice,Apple juice, bottled,53,0.1,0.0,13.5,7,0.7,1,0,0.01,1

 

Kod:

package wyklad;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class Projekt {

	public static void main(String[] args) throws IOException{
		BufferedReader x = new BufferedReader(new FileReader("dane.txt"));
		
		String schowek; int a=0, b=1;
		
		schowek = x.readLine();
		
		for(int i=0; i<schowek.length();i++){
			if (schowek.charAt(i)==','){
				b++;
				System.out.println("b " +b);
			}
		}
		
		do{
			a++;
			schowek = x.readLine();
			System.out.println("a " + a);
		}
		while(schowek!=null);
		
		System.out.println(a+" " + b);
		
		String tab[][] = new String[a][b];
		
		for(int i=0; i<tab.length; i++){
			for(int j=0; j<tab[0].length; j++){
				tab[i][j]="_";
			}
		}
		
		BufferedReader y = new BufferedReader(new FileReader("dane.txt"));
		
		schowek = y.readLine();
		
		int pamietajWiersz=0, pamietajKolumne;
		
		do{
			pamietajKolumne=0;
			for(int i=0; i<schowek.length(); i++){
				while(!(Character.toString(schowek.charAt(i))).equals(",")){
					tab[pamietajWiersz][pamietajKolumne]+=Character.toString(schowek.charAt(i));
				}
				if(Character.toString(schowek.charAt(i)).equals(",")){
					pamietajKolumne++;
				}
				System.out.println(tab[pamietajWiersz][pamietajKolumne]);
			}
			pamietajWiersz++;
			schowek = y.readLine();
		}
		while(schowek!=null);
		
		for(int i=0; i<tab.length; i++){
			for(int j=0; j<tab[0].length; j++){
				System.out.print(tab[i][j] + " ");
			}
			System.out.println();
		}
			
		
		
	}
	
}

Zadeklarowałem tablicę dwuwymiarową Stringów, w planach miałem, by program dodawał po 1 znaku z linijki, a w momencie natrafienia przecinka, przeskoczył linijkę dalej. Problem tkwi w drugiej pętli do {} while();

2 odpowiedzi

+1 głos
odpowiedź 11 maja 2017 przez Mateusz51 Nałogowiec (28,180 p.)
Możesz jaśniej wyjaśnić co chcesz zrobić i w czym leży problem?
komentarz 11 maja 2017 przez embid123 Użytkownik (630 p.)
Wczytuję dane z pliku tekstowego do macierzy. Każda komórka macierzy jest oddzielona ",". licząc ilośc tych przecinków i zwiększajac o 1 mam ilosć kolumn, licząc ilość wierszy mam ilośc wierszy. Potem jeszcze raz załadowuje plik i wgrywam do macierzy zawartość. Zawartość dodaję po 1 znaku. Wystąpienie przecinka zwiększa numer kolumny o 1, jedno przejście petli zmienia numer wiersza o 1. Na koniec próbuję wyświetlić macierz.
komentarz 11 maja 2017 przez embid123 Użytkownik (630 p.)
Problem leży gdzieś w tej pętli do while, gdzie próbuję wczytać macierz. Program albo tam się zapętla w nieskończoność, albo ją jakoś pomija i wyświetla mi "nic".
komentarz 11 maja 2017 przez Mateusz51 Nałogowiec (28,180 p.)
Tylko dlaczego chcesz wpisać pojedyncze znaki do tablicy stringów a nie całe wyrazy?
komentarz 11 maja 2017 przez embid123 Użytkownik (630 p.)
ogólnie to miałem z tym problem. Moje założenie było takie, że w tab[][] przypisze każdej komórce wartosć "_" przykładowo. Następnie będę wrzucał po jednym znakiem metodą tab[i][j] += Character.toString(mojaZmienna.CharAt(i));

gdy występuje przecinek, to miał być sygnał dla programu, by przeskoczył do następnej komórki.

Co do słów, 90% moich danych to liczby, 10% to opisy tych danych, dlatego wolałem dodawac po znaku.

 

PS. nie mogę edytowac pliku.
komentarz 11 maja 2017 przez Mateusz51 Nałogowiec (28,180 p.)
Mi przyszło inne rozwiązanie. Abyś pobierał linijke i używając split(",") dostawał tablice wyrazów. Do tego rozwiązania nie musisz znać nawet ilośći kolumn.

A co do twojego rozwiązania popatrze czemu Ci nie działa.
komentarz 11 maja 2017 przez embid123 Użytkownik (630 p.)
Okej, spróbuję
komentarz 11 maja 2017 przez Mateusz51 Nałogowiec (28,180 p.)
A nie działa Ci dlatego że masz fora a w nim while. I chcesz w tym while zrobić to do czego używałeś fora. Jak zmienisz while na if a if na else powinno działać
komentarz 11 maja 2017 przez embid123 Użytkownik (630 p.)
dzięki :)
0 głosów
odpowiedź 11 maja 2017 przez embid123 Użytkownik (630 p.)
nie przeskoczył linijkę dalej, a kolumnę dalej*

Podobne pytania

0 głosów
0 odpowiedzi 425 wizyt
0 głosów
1 odpowiedź 1,069 wizyt
pytanie zadane 27 marca 2020 w C i C++ przez Hubert731 Obywatel (1,650 p.)

93,608 zapytań

142,531 odpowiedzi

323,004 komentarzy

63,101 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...