• 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.

Object Storage Arubacloud
0 głosów
781 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 141 wizyt
0 głosów
1 odpowiedź 546 wizyt
pytanie zadane 27 marca 2020 w C i C++ przez Hubert731 Obywatel (1,650 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...