Odczyt z pliku, zapis każdego wersu w osobnej liście

Odczyt z pliku, zapis każdego wersu w osobnej liście
ndziwins
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2
0

Cześć,

Poziom begginer ;)
Mam problem: mam plik .txt z podziałem na osobne wersy. W każdym wersie jest ciąg Stringów podzielonych przecinkiem.

Potrzebuję aby każdy wers został zapisany do osobnej listy.

Kopiuj
		File inputFile = new File(input); //oczywiście input to u mnie konkretna ścieżka do workspace
		ArrayList<String> lines = new ArrayList<String>();
		

		Scanner sc = new Scanner(inputFile);
		int linesNo = 0; //licznik linii
		
		while (sc.hasNextLine()) {
			String line = sc.nextLine();
						
			Scanner linesSc = new Scanner(line);
			linesSc.useDelimiter(",");
			
			while (linesSc.hasNext()) {
			String a = linesSc.next();
			ArrayList lin = new ArrayList();
			lin.add(a);
			lines.addAll(linesNo, lin);
			}
		
			linesSc.close();
			linesNo++;
	        }
		sc.close();
		System.out.println(lines);
		System.out.println(lines.get(linesNo);
	}
}

W kodzie powyżej chciałem utworzyć z tego listę dwuwymiarową, ale czegoś w tym brakuje (zapewne pętli, choć trochę się pogubiłem). No i oczywiście mam przeczucie, że da się to wszystko zrobić dużo łatwiej... z góry dziękuję za jakąkolwiek formę naprowadzenia na rozwiązanie.

W0
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3755
0

Rozumiem, że masz coś takiego:

Tekst:

Kopiuj
wers 1, wers 2, wers 3
wers 4, wers 5, wers 6

I docelowo chciałbyś mieć listę:

Kopiuj
[[wers 1], [wers 2], [wers 3], [wers 4], [wers 5], [wers 6]]

Możesz napisać po co ci to? Bo rozwiązanie zależy od tego.

Jeśli chodzi o rady to do odczytu linijka po linijce nie korzystaj z Scannera, tylko z metody Files.lines():
https://www.mkyong.com/java8/java-8-stream-read-a-file-line-by-line/

catom
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 58
1

Problem w tym, że w Twoim wewnętrznym while tworzysz nową listę per łańcuch znaków utworzony na podstawie podziału wersu na łańcuchy znaków oddzielone przecinkiem.
Tworzenie tej ArrayList lin powinno odbywać się w momencie pobrania kolejnej linii. Wówczas, dla każdego wersu, będziesz miał listę. Następnie, w wewnętrznym while, powinieneś tylko dodawać elmenty do listy. Listę ArrayList lin z kolei, dodajesz do swojej ArrayList<String> lines.

Jeśli możesz korzystać z Java 8+ i Streamów, to można to zrobić tak: List<String> lines = Files.lines(input).map(line -> line.split(",")).map(Arrays::asList).collect(Collectors.toList());

ndziwins
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2
0

@wartek01 - dzięki, ale nie o to mi chodziło. Clue były osobne listy dla każdej linii z pliku, a nie jedna łącząca wszystkie dane. :)

@catom - dopiero się uczę i Streamy są jeszcze ciut egzotyczne dla mnie. Jeszcze przysiądę do tego ;)
W każdym razie podpowiedź do Scanner okazała się bardzo pomocna. Jeszcze raz dzięki.

Kopiuj
		ArrayList<ArrayList> lines = new ArrayList<ArrayList>();

		//input to konkretna ścieżka do pliku
		File inputFile = new File(input);
		ArrayList<ArrayList> lines = new ArrayList<ArrayList>();
		Scanner sc = new Scanner(inputFile);

		while (sc.hasNextLine()) {
			ArrayList<String> lin = new ArrayList<String>();
			String line = sc.next();

			Scanner linesSc = new Scanner(line);
			linesSc.useDelimiter(",");

			while (linesSc.hasNext()) {
				String a = linesSc.next();
				lin.add(a);
			}
			lines.add(lin);
			linesSc.close();
		}
		sc.close();

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.