Plik tekstowy ladowany to Arrays

0

Witam

Posiadam plik tekstowy ktory ma w kazdej lini po 7 slow odzielonych spacja.
Chcial bym zaladowac ten plik do Arrays w javie w taki sposob ze 1 slowa z lini beda w 1 kolumnie 2 slowa beda w 2 kolumnie itd.

uzywalem tego kodu:

 
  Scanner inFile1 = new Scanner(new File("KeyWestTemp.txt")).useDelimiter(",\\s*");
 
    List<String> temps = new ArrayList<String>();

    // while loop
    while (inFile1.hasNext()) {
      // find next line
      token1 = inFile1.next();
      temps.add(token1);
    }
    inFile1.close();

    String[] tempsArray = temps.toArray(new String[0]);

Niestety ten kod laduje wszystko w 1 arrays.

Dziekuje z gory za <ort>wzkazowki/</ort> pomoc.

0

Skoro jest tak regularnie podzielony to robisz tak:

 
 String[] wiersz = inFile1.next().split(" ");

A potem robisz jakiegoś for'a który przepisze wiersz na kolumnę String[][].

Ps. używaj tagów.

0

Dziekuje za szybkka odpwiedz jednak ze niewiele mi ona mowi. Mozna prosic o jakas bardziej szczegolowa?

  • probowalem loopem zczytac slowo po slowie i zapisywac je jako string a pozniej przeniesc to jakos do arrays ale niestety nie udalo mi sie, jest to w ogole mozliwe?
0
  1. Wstawiaj kod w znaczniki <code class="java"></code>
  2. Zmień sposób czytania. Używając delimitera \\s* zacierasz różnicę między spacjami i tabulatorami, a znakiem nowego wiersza.
            Scanner inFile1 = new Scanner(new File("Dupa.txt"));
            while (inFile1.hasNextLine()) 
            {               
                String[] wordsInLine = inFile1.nextLine().split(" ");
                ...
            }
            inFile1.close();
  1. Nie chcę mi się domyślać co nazywasz kolumnami w Arrays, więc więcej kodu nie podam.
3

Scanner to już przeżytek, zwłaszcza do małych plików.

Spróbuj tak:

String[][] array = Files.lines(Paths.get("sciezkaDoPliku.txt"))
				.map(s -> s.split(" "))
				.toArray(String[][]::new);
0

Witam ponownie, rozwiazaniem mojego problemu a zarazem rozpoczeciem kolejnego byly arraylists.

 while (fileIn.hasNext()) {
						
						 int Number = fileIn.nextInt(); 
						 LNumber.add(Number);
						 String Standard = fileIn.next(); 
						 LStandard.add(Standard);

Dzieki temu plik tekstowy zostal zaladowany do arrays tak jak chcialem. Problem jaki powstal to nadpisanie pliku z ktorego te dane zostaly wziete. W konsoli informacje wyswietlaja sie prawidlowo ale jezeli probuje je zapisac do pliku z ktorego je wzialem to plik sie kasuje.
kod :

 for(int i = 0; i < LNumber.size() +  LStandard.size(); i++
System.out.print(" "+ (LNumber.get(i)).toString() + " " + (LStandard.get(i)).toString())
}

Ktos mogl by cos poradzic?

0
JavaArrays napisał(a):

Dzieki temu plik tekstowy zostal zaladowany do arrays tak jak chcialem. Problem jaki powstal to nadpisanie pliku z ktorego te dane zostaly wziete. W konsoli informacje wyswietlaja sie prawidlowo ale jezeli probuje je zapisac do pliku z ktorego je wzialem to plik sie kasuje.
kod :

 for(int i = 0; i < LNumber.size() +  LStandard.size(); i++
System.out.print(" "+ (LNumber.get(i)).toString() + " " + (LStandard.get(i)).toString())
}

Ktos mogl by cos poradzic?

To daj kod w którym zapisujesz to do pliku, może jakiś błąd masz;)

btw,
i < LNumber.size() + LStandard.size()
LNumber.get(i)
nie leci tu żaden indexOutOfBounds czy cos?:p

0

jezeli probuje je zapisac do pliku z ktorego je wzialem to plik sie kasuje

Przed zapisem musisz zamknąć plik, z którego czytałeś i otworzyć go na nowo.
P.S. jak napisał wyżej @Madlova, kod

LNumber.get(i)).toString() + " " + (LStandard.get(i)).toString()

musi rzucić wyjątkiem (chyba, że obie kolekcje są puste). Jeśli tego wyjątku nie widzisz, tzn,. że całkowicie skopałeś obsługę błędów w swoim programie.

0

Witam ponownie sprawe udalo mi sie rozwiazac taka metoda

try (Writer zapisz = new BufferedWriter(new OutputStreamWriter(
	              new FileOutputStream("lol.txt"), "utf-8"))) {
  • loop do tego
 for(int i = 0; i <  + LNumber.size() + LStandard.size(); i++) {
 writer.Zapisz (" "+ (LNumber.get(i)).toString() + " " + (LStandard.get(i)).toString()); 
}
}

Plik sie zapisuje ladnie dokladnie 44 pozycje ale zaraz po tym w consoli mam blad

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 44, Size: 44
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at Reservation.main(Reservation.java:157)

Writer.zapisz to linia 157

rozumiem ze to oznaca ze java probuje dostac sie do pozycji 44 ale jej sie to nie udaje bo w teori jest ona pusta. Problem w tym ze chwile wczesniej zapisala to bez zadnego problemu do pliku tekstowego.

Ps wiem ze arrays sie zaczynaja od 0, a jedyne rozwiazanie ktore znalazlem a nie dziala bo juz bylo zrobione to zmiana <= na < .

Ktos ma jakis pomysl?

Dziekuje

0

Z odczytującego kodu, który podałeś wcześniej wynika, że LNumber.size() == lStandard.size(). Zatem:

for(int i = 0; i <  + LNumber.size(); i++) 
0

I znowu - używajcie NIO, a nie starych rzeczy.

        String[][] newArray = {{"a", "b", "c"}, {"d", "e", "f"}};

        List<String> linesToWrite =
                Stream.of(newArray)
                        .map(sArray -> Arrays.asList(sArray))
                        .map(list -> String.join(" ", list))
                        .collect(Collectors.toList());

        Files.write(
                Paths.get("c:/test.txt"),
                linesToWrite,
                StandardOpenOption.CREATE);

EDIT: poprawka z Stream.of().collect -> Arrays.asList. Na pewno ładniej to wygląda.

0
bogdans napisał(a):

Z odczytującego kodu, który podałeś wcześniej wynika, że LNumber.size() == lStandard.size(). Zatem:

for(int i = 0; i <  + LNumber.size(); i++) 

Witam, nie do konca wiem dlaczego ale ten sposob zalatwil sprawe. Wydawalo mi sie ze jezeli sa to 2 rozne arraylist to musze uwzglednic je razem.

Dziekuje za pomoc.

0
JavaArrays napisał(a):
bogdans napisał(a):

Z odczytującego kodu, który podałeś wcześniej wynika, że LNumber.size() == lStandard.size(). Zatem:

for(int i = 0; i <  + LNumber.size(); i++) 

Witam, nie do konca wiem dlaczego ale ten sposob zalatwil sprawe. Wydawalo mi sie ze jezeli sa to 2 rozne arraylist to musze uwzglednic je razem.

"i" to liczba iteracji, czyli tyle ile razy wykonasz dany blok kodu. "i" wzrasta za każdym przejściem. Jeśli Twoja tablica 1 ma rozmiar 50, i Twoja tablica 2 ma rozmiar 50, to iterując do 1.size() + 2.size() iterujesz do 100! Wykonujesz blok kodu sto razy. W 51 przebiegu "i" wynosi 50.* Próbujesz dobrać się do 50 elementu tablicy, która ma tylko wartości na pozycjach od 0 do 49, więc leci wyjątek IndexOutOfBounds:)
(index - 50 - poza granicami - 0-49)

*bo liczymy od 0, int i = 0;

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