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

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
975 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 214 wizyt
0 głosów
1 odpowiedź 862 wizyt
pytanie zadane 27 marca 2020 w C i C++ przez Hubert731 Obywatel (1,650 p.)

93,187 zapytań

142,202 odpowiedzi

322,012 komentarzy

62,514 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 2365p. - dia-Chann
  2. 2326p. - Łukasz Piwowar
  3. 2315p. - Łukasz Eckert
  4. 2269p. - Tomasz Bielak
  5. 2235p. - Łukasz Siedlecki
  6. 2006p. - Michal Drewniak
  7. 2006p. - rucin93
  8. 1964p. - CC PL
  9. 1946p. - Adrian Wieprzkowicz
  10. 1901p. - Mikbac
  11. 1744p. - rafalszastok
  12. 1734p. - Anonim 3619784
  13. 1586p. - Dawid128
  14. 1520p. - Marcin Putra
  15. 1480p. - ssynowiec
Szczegóły i pełne wyniki

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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...