Zczytanie pliku txt na drzewo

0

Cześć,
Mam do wykonania projekt na studiach. Jednym z wymogów jest wczytanie pliku txt i stworzenie drzewa.
Problem jest taki, że nie bardzo wiem z której strony to ugryźć i czego użyć do odpowiedniego zczytywania.
Mój plik wygląda następująco:

"Czlowiek 1"(
	"imie"("Jan"),
	"nazwisko"("Kowalski"),
	"sąsiedzi"(
		"Czlowiek 2"(
			"imie"("Pawel"),
			"nazwisko"("Nowak")),
		"Czlowiek 3"(
			"imie"("Ewa"),
			"nazwisko"("Drzyzga")),
	"dodatkoweInfo"(
		"wiek"("38l"),
		"waga"("90kg")))

Nawiasy, przecinki, cudzysłowy będą w tym samym miejscu, to się nie zmieni. Może wzrosnąć ilość sąsiadów no i węzłów dodatkoweInfo.

Potrzebuję przechować te informacje w taki sposób, że konkretną metodą będę mógł zmienić wagę w dodatkoweInfo.
W sąsiadach przechowuję tylko imie i nazwisko. Potrzebuję konkretnie przechowywać informacje, Czlowiek (glowny) - imie, nazwisko, sąsiedzi (Czlowiek x - imie, nazwisko), dodatkoweInfo (nazwa - dana).

Myślałem, że mogę próbować to utrzymać w mapie ale problem sprowadza się do odpowiedniego zczytania pliku. regex da sobie z tym radę (format pliku)? Czy, uważacie, że sprawdzanie po nawiasach jest dobrą drogą? Może po prostu czytać cały plik, szukać słowa "Czlowiek" i za każdym razem jak coś znajdzie to wtedy przeszukiwać najbliższe wartości po słowach imie i nazwisko i wrzucać do mapy? To samo z dodatkowe info? Tylko znowu jest problem aby po przejściu w działkę "dodatkoweInfo" zczytać "wiek" jako klucz a "38l" jako wartość pomijając wszelkie nawiasy i cudzysłowy.

Czy moje rozmyślenie jest dobre?
Prosiłbym o ocenę albo podrzucenie jakichś pomysłów bo stoję w miejscu.

0

Czy ten plik musi być w takim formacie, czy tylko tak go sobie wymyśliłeś?

Jeśli nie musi, to są prostsze metody na coś takiego - JSON, XML. Java udostępnia do nich parsery, które serializację/deserializację niemalże robią za Ciebie (w przypadku xml, jest jaxb, który od razu może stworzyć Ci z nich gotowe do pracy obiekty).

Jeśli musi - no to musisz sam się bawić w odsianie tego wszystkiego - jako, że są nowe linie, to można się chociaż regexami pobawić. Niemniej polecam rozwiązanie z JSON/XML.

0

Super, dziękuję za odpowiedź.

Czy mówiąc format masz na myśli, że czy to plik textowy czy same nawiasy, przecinki?
Tzn. w sumie nie mam powiedziane jaki to format pliku - textowy czy jaki.
Napisane mam tylko, "przykładowy plik ma taką zawartość".

Obiło mi się o uszy, że przy tym można wykorzystać JSONa tyle, że te nawiasy (ilość) miałyby przeszkodzić w czytaniu?
Czy mógłbym przy nim pomijać te przecinki etc?
Raczej nikogo to nie obchodzi czy wykorzystam je czy nie, najważniejsze abym zdobył wiedzę z tego pliku nie pomijając niczego.

0

Chodziło mi o nawiasy i cudzysłowy. Jeśli tak wygląda "przykładowy plik", to nie wiem czy można zrobić coś standardowego.

Bo np. JSON wygląda tak: http://json.org/example.html
więc o ile istniałaby możliwość zapisywania danych w formacie JSON, a nie tak jak są teraz - to sprawa byłaby banalna.

Mogę wiedzieć co to za projekt i na jakie zajęcia? Bo to pewnie samo w sobie dużo powie o naturze tego zadania.

0

Hej, udało mi się stworzyć JSONa.
Wygląda on tak:

{
	"Czlowiek 1": {
		"imie": "Jan",
		"nazwisko": "Kowalski",
		"sąsiedzi": {
			"Czlowiek 2": {
				"imie": "Pawel",
				"nazwisko": "Nowak"
			},
			"Czlowiek 3": {
				"imie": "Ewa",
				"nazwisko": "Drzyzga"
			}
		},
		"dodatkoweInfo": {
			"wiek": "38l",
			"waga": "90kg"
		}
	}
}

Jest on poprawny, np. wartość imie, nazwisko w obiekcie "Czlowiek 1" zczytuje tak:

        JSONObject obj = new JSONObject(json);
        System.out.println("Czlowiek 1 imie: " + obj.getJSONObject("Czlowiek 1").getString("imie"));
        System.out.println("Czlowiek 1 nazwisko: " + obj.getJSONObject("Czlowiek 1").getString("nazwisko"));

To się zgadza, potrafię się dostać na sztywno. Problem jest taki, że sąsiadów mogę mieć kilku, nie wiem ilu zostanie podrzuconych, tak samo w dodatkowym info, informacje mogą być zagnieżdżone i wyglądać dużo trudniej. W sąsiadach jest o tyle lepiej, że będzie tylko imie, nazwisko. Gorzej z tymi informacjami bo zapewne może ktoś specjalnie wrzucić coś na wzór:

	"dodatkoweInfo": {
		"rodzice": {
			"odTaty": {
				"imieB": "Genowefa",
				"imieD": "Jan"
			},
			"odMamy": {
				"imieB": "Krystyna",
				"imieD": "Antoni"
			}
		},
		"waga": "90kg"
	}

Muszę te dane przetrzymywać, sąsiedzi to prościzna - obiekt i dwa pola. Gorzej z tym powyżej, potrzebuję to przechować w jakiejś strukturze, która będzie tworzyła węzły.

I teraz pytanie, chciałbym poczytać sobie np. sąsiadów zwykłą pętlą (np. for), jest to możliwe?
Co byłoby najlepszym rozwiązaniem z wczytywaniem inormacji? Trzeba tam jakoś wejść, po kolei zczytywać i zapisywać informacje o sobie a potem wrócić (w tym przypadku do "waga").

Z góry dziękuję!

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