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

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.

		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.

0

Rozumiem, że masz coś takiego:

Tekst:

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

I docelowo chciałbyś mieć listę:

[[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/

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());

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.

		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();

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