• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dylemat z odczytywaniem pliku tekstowego

VPS Starter Arubacloud
0 głosów
183 wizyt
pytanie zadane 23 lipca 2020 w Java przez sobussss Początkujący (350 p.)
Witam, mam pewien problem z odczytaniem pliku, ponieważ chciałbm odczytac kazda linijke z pliku, gdzie w kazdej dane sa rozdzielone spacjami i kazda kolumne wczytac do innej zmiennej(np. tablica, lub ArrayList).

Przykład:

124,3 32,2 23,1 321,9

Prosze bardzo o pomoc, poniewaz jest mi to potrzebne do pracy. Najlepiej by było jakby ktoś napisał mi cała pętle , gdzie odczytuje kazda linijke i wstawia kazda kolumne do odzielnej zmiennej.

Pozdrawiam

1 odpowiedź

0 głosów
odpowiedź 23 lipca 2020 przez reaktywny Nałogowiec (40,650 p.)

Tak na szybko:

List<String> myList = Files.readAllLines(Paths.get("C:\\plik_tekstowy.txt"));

Tak dzielisz Stringa, na kawałki oryginalnie rozdzielone spacjami w zmiennej str:

String[] strList = str.split(" ");

 

komentarz 23 lipca 2020 przez DedenN Początkujący (400 p.)
opcjonalnie można użyć scannera :D jeśli to do pracy to polecam jako path podać sourceroota do pliku, wtedy nie będzie problemu ze mnianą maszyny :D
komentarz 23 lipca 2020 przez sobussss Początkujący (350 p.)

@reaktywny,  a mógłbys bardziej cos podpowiedziec bo to co napisales to jest do samego odczytywania? A jeszcze by mi byly potrzebne inforamcje jak zapisac kazda kolumne do odzielnej zmiennej tablicowej

Pozdrawiam

 

komentarz 23 lipca 2020 przez reaktywny Nałogowiec (40,650 p.)
Pierwsza linia kodu wczytuje wszystkie linie z pliku tekstowego do Listy stringów. Linia po linii. A druga pojedynczego stringa dzieli w miejscach gdzie występują spacje i wrzuca substringi do tablicy stringów.

To co chcesz zrobić można wykonać w jednym wyrażeniu za pomocą strumieni. Ale "klasyczne podejsćie" w kilku krokach wydaje się łatwiejsze do zrozumienia.

Wiesz jak się przelatuje pętlą for po elemetach tablicy czy kolekcji? Jeśli tak, to nie powinieneś mieć problemów.

Powodzenia!
komentarz 23 lipca 2020 przez sobussss Początkujący (350 p.)

i jeszcze zapytam tak, co dodac do tego kodu, aby zapisalo kazda odczytana kolumne w innej tablicy typu ArrayList?

ArrayList<Float> lista1=new ArrayList<>();
ArrayList<Float> lista2=new ArrayList<>();
ArrayList<Float> lista3=new ArrayList<>();
ArrayList<Float> lista4=new ArrayList<>();
ArrayList<Float> lista5=new ArrayList<>();
File plik=new File("plik.txt");
Scanner scan= new Scanner(plik);;

    while (scan.hasNextLine()) {
        String line = scan.nextLine();
        String[] lineArray = line.split(" ");
        System.out.println(Arrays.toString(lineArray));
    }
    scan.close();
}
komentarz 23 lipca 2020 przez reaktywny Nałogowiec (40,650 p.)
edycja 24 lipca 2020 przez reaktywny

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class JavaClassOne {

    public static void main(String[] args) throws IOException {

        String currentDir = new java.io.File(".").getCanonicalPath();
        List<List<String>> data = new ArrayList<>();

        // wczytanie danych
        try (BufferedReader br = new BufferedReader(new FileReader(currentDir + "/src/moj_plik_tekstowy.txt"))) {
            String line;
            while ((line = br.readLine()) != null) {
                String[] values = line.split(" ");
                data.add(Arrays.asList(values));
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        // wyświetlenie danych
        for (var line : data) {
            for (var value : line) {
                System.out.print(value + " ; ");
            }
            System.out.println("");
        }
    }
}

Możesz użyć: List<List<String>> data = new ArrayList<>();

Lista listy stringów. Teraz widzę, że masz Floaty :) Z konwersją poradzisz sobie?

Tylko dostosuj ścieżkę do swojego pliku.

---

To rozwiązanie z 5 listami jest kategorycznie złe, a co jak w pliku byłoby 150 linii? Utworzysz 150 list?

---

Jeszcze rozwiązanie na strumieniach, o którym pisałem wcześniej:

List<String[]> data2 = br.lines()
                .map(s -> s.split(" "))
                .collect(Collectors.toList());

 

 

 

komentarz 24 lipca 2020 przez reaktywny Nałogowiec (40,650 p.)
edycja 24 lipca 2020 przez reaktywny

Można jeszcze zamienić Stringi na liczby zmiennoprzecinkowe i wtedy też trzeba zamienić przecinki na kropki:

List<List<Float>> data = new ArrayList<>();

 


    // wczytanie danych
        try (BufferedReader br = new BufferedReader(new FileReader(currentDir + "/src/moj_plik_tekstowy.txt"))) {
            String line;
            while ((line = br.readLine()) != null) {
                String[] values = line.split(" ");
                Float floats[] = new Float[values.length];
                for (int i = 0; i < values.length; i++) {
                    floats[i] = Float.parseFloat(values[i].replace(",", "."));
                }
                data.add(Arrays.asList(floats));
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

 

Tu całóść:

https://pastebin.com/u5anRV00

komentarz 24 lipca 2020 przez sobussss Początkujący (350 p.)
Dziekuje bardzo za pomoc, ale wyswietla mi sie taki blad.

PS. nie ma znaczenia czy to beda tablice floatow, czy stringow i nie musze ich parsowac

Exception in thread "main" java.lang.NumberFormatException: empty String
    at java.base/jdk.internal.math.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1842)
    at java.base/jdk.internal.math.FloatingDecimal.parseFloat(FloatingDecimal.java:122)
    at java.base/java.lang.Float.parseFloat(Float.java:461)
    at Projekt2.main(Projekt2.java:22)
komentarz 24 lipca 2020 przez sobussss Początkujący (350 p.)

i dotyczy to tej linijki

floats[i] = Float.parseFloat(values[i].replace(",", "."));

 

komentarz 24 lipca 2020 przez reaktywny Nałogowiec (40,650 p.)
Pokaż cały lub fragment swojego pliku z danymi.

(jak wystarczą Stringi, to możesz powrócić do starszej wersji - powyżej).
komentarz 24 lipca 2020 przez sobussss Początkujący (350 p.)
1008,9    4,0    4,2    2,4    306,3                
1008,4    3,9    3,9    2,6    298,1                
1008,0    3,9    3,3    2,8    294,7                
1007,9    4,1    2,8    3,0    295,5                
1007,9    4,2    3,2    3,8    296,9                
1007,7    4,4    4,6    4,3    297,7                
1007,6    4,5    7,0    4,2    306,9                
1007,1    4,3    9,4    4,7    322,4       

tak to wyglada, no i kazda ta kolumna powinna byc zapisana w innej zmiennej
komentarz 24 lipca 2020 przez reaktywny Nałogowiec (40,650 p.)
edycja 24 lipca 2020 przez reaktywny

https://pastebin.com/kMxD4Jjt

W 17-tej linii można włożyć jeszcze metodę trim():

String[] values = line.trim().replace("    ",";").split(";");
komentarz 24 lipca 2020 przez sobussss Początkujący (350 p.)
Niestety, ale znowu taki sam komunikat o błedzie wyskakuje.
komentarz 24 lipca 2020 przez reaktywny Nałogowiec (40,650 p.)

Dziwne, a spróbuj tak, podmienić 17 linię:

String[] values = line.trim().split("[ ]+");
komentarz 24 lipca 2020 przez sobussss Początkujący (350 p.)
Niestety, ale dalej jest to samo:

Exception in thread "main" java.lang.NumberFormatException: empty String
    at java.base/jdk.internal.math.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1842)
    at java.base/jdk.internal.math.FloatingDecimal.parseFloat(FloatingDecimal.java:122)
    at java.base/java.lang.Float.parseFloat(Float.java:461)
    at Projekt3.main(Projekt3.java:22)
komentarz 24 lipca 2020 przez reaktywny Nałogowiec (40,650 p.)

Jeszcze zamień:

floats[i] = Float.parseFloat(values[i].replace(",", "."));

na:

floats[i] = Float.parseFloat(values[i]);
komentarz 24 lipca 2020 przez reaktywny Nałogowiec (40,650 p.)
Może masz Windowsa PL i decimal separator to przecinek, a nie kropka?
komentarz 24 lipca 2020 przez sobussss Początkujący (350 p.)
Dalej to samo.

Chyba tak. Mam Windows 10 Edcation
komentarz 24 lipca 2020 przez reaktywny Nałogowiec (40,650 p.)
A wkleiłeś fragment pliku, czy cały? Jak możesz to wystaw go gdzieś na jakimś serwisie do udostępniania... Mega.nz, Dropbox czy Google Drive.
komentarz 24 lipca 2020 przez reaktywny Nałogowiec (40,650 p.)
https://pastebin.com/7CRJBbb9

jeszcze wypróbuj ten kod.
komentarz 24 lipca 2020 przez sobussss Początkujący (350 p.)
Dalej to samo,

1008,9    4,0    4,2    2,4    306,3                
1008,4    3,9    3,9    2,6    298,1                
1008,0    3,9    3,3    2,8    294,7                
1007,9    4,1    2,8    3,0    295,5                
1007,9    4,2    3,2    3,8    296,9                
1007,7    4,4    4,6    4,3    297,7                
1007,6    4,5    7,0    4,2    306,9                
1007,1    4,3    9,4    4,7    322,4                    
984,0    9,0    12,1    1,9    177,5                
984,1    9,0    12,1    1,8    179,9                
984,5    9,1    12,4    2,2    177,6                

to jest caly plik
komentarz 24 lipca 2020 przez reaktywny Nałogowiec (40,650 p.)
U mnie wyrzuca:

/usr/lib/jvm/java-1.11.0-openjdk-amd64/bin/java -javaagent:/snap/intellij-idea-community/244/lib/idea_rt.jar=37707:/snap/intellij-idea-community/244/bin -Dfile.encoding=UTF-8 -classpath /home/user123/IdeaProjects/untitled1/out/production/untitled1 JavaClassOne
1008.9-4.0-4.2-2.4-306.3-
1008.4-3.9-3.9-2.6-298.1-
1008.0-3.9-3.3-2.8-294.7-
1007.9-4.1-2.8-3.0-295.5-
1007.9-4.2-3.2-3.8-296.9-
1007.7-4.4-4.6-4.3-297.7-
1007.6-4.5-7.0-4.2-306.9-
1007.1-4.3-9.4-4.7-322.4-
984.0-9.0-12.1-1.9-177.5-
984.1-9.0-12.1-1.8-179.9-
984.5-9.1-12.4-2.2-177.6-

Process finished with exit code 0

 

Pomyślę, zobaczę i coś wieczorem podrzucę. Może ktoś w międzyczasie znajdzie co jest przyczyną....
komentarz 24 lipca 2020 przez sobussss Początkujący (350 p.)
dobra to dzieki, a czy w tym kodzie jest to zapisywanie kolumn do zmiennych?
komentarz 24 lipca 2020 przez reaktywny Nałogowiec (40,650 p.)
W zmiennej data jest wszystko przechowywane:

List<List<Float>> data = new ArrayList<>();

To jest Lista list, coś jak dwuwymiarowa tablica (ale nie dokładnie to samo!). Masz listę list która przechowuje floaty, albo stringi (bo przesłałem Tobie dwie wersje).
komentarz 24 lipca 2020 przez sobussss Początkujący (350 p.)
to jak sie dobrac do konkretnej listy, w ktorej kazda kolumna jest zapsiana odzdzielnie?
komentarz 24 lipca 2020 przez reaktywny Nałogowiec (40,650 p.)
Wszystko jest oddzielnie. Jeden z przykładów dostępu do listy masz w kodzie - dwię pętle for przelatują po tych List-ach.

Tu masz metody dla List:

https://docs.oracle.com/javase/8/docs/api/java/util/List.html

możesz użyć get() podając index. Ale pewnie użycie for będzie wygodniejsze.
komentarz 25 lipca 2020 przez sobussss Początkujący (350 p.)
for (List< String > datum : data) {
    System.out.println(datum);

Czy taka petla dobiore sie do kazdej listy z kolumnami?

 

Podobne pytania

0 głosów
0 odpowiedzi 567 wizyt
pytanie zadane 17 maja 2021 w C i C++ przez ktoś123 Nowicjusz (180 p.)
0 głosów
1 odpowiedź 320 wizyt
pytanie zadane 27 stycznia 2020 w C i C++ przez kexiu Nowicjusz (170 p.)
0 głosów
1 odpowiedź 103 wizyt
pytanie zadane 8 maja 2018 w PHP przez Browarnik123 Użytkownik (830 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 pasjonatów

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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...