NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Praca z textovim suborom

V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
ronep
Člen
Avatar
ronep:30.6.2015 14:38

v sekcii z pracou zo subormi pre javu som nasiel ako nacitat z textoveho suboru vsetko zaradom ale mna bi skor zaujimalo ako nacitat vibrani riadok v subore

 
Odpovědět
30.6.2015 14:38
Avatar
mara
Člen
Avatar
Odpovídá na ronep
mara:30.6.2015 15:03

Zkus načítat řádek po řádku a který řádek potřebuješ, tak tam se zastav.

Nahoru Odpovědět
30.6.2015 15:03
Co na srdci, to na Facebooku
Avatar
ronep
Člen
Avatar
ronep:20.7.2015 21:58

ok ale ja poviem programu ze chcem riadok 5 a on nacita 1-5 a potom sa zastavi to by aj isle ale ked mu poviem ze cgcem riadok 555 tak to bude nacitat riadok 1 az riadok 555 a medi tim mi zaplni ramku ani nigdi nedostane
ja chcem priamo len ten riadok ok ?

 
Nahoru Odpovědět
20.7.2015 21:58
Avatar
Odpovídá na ronep
Petr Štechmüller:20.7.2015 22:01

Ahoj, přímo na daný řádek se nedostaneš. Jediný způsob Ti tu už napsali a to načítat soubor řádek po řádku dokud se nedostaneš tam kam potřebuješ.

Nahoru Odpovědět
20.7.2015 22:01
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá na ronep
Petr Štechmüller:20.7.2015 22:08

Tak bych se chtěl opravit. Trošku jsem zagooglil a přeci jenom jsem něco našel.
Pro načítání malých souborů můžeš použít toto:

String line = Files.readAllLines(Paths.get("file.txt")).get(555);

Pro načítání větších souborů pak toto:

try (Stream<String> lines = Files.lines(Paths.get("file.txt"))) {
            String line = lines.skip(555).findFirst().get());
        } catch (IOException e) {
            e.printStackTrace();
        }
Nahoru Odpovědět
20.7.2015 22:08
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá na ronep
Martin Bartoš:28.7.2015 18:52

Skús toto:

String text_riadka="";
try (BufferedReader reader = new BufferedReader(new FileReader(Nejaky súbor)))
 {
      int pocet_riadkov_suboru=0;

            while(reader.readLine() != null)
             {
                        pocet_riadkov_suboru++;
             }

        for(int i=0;i<pocet_riadkov_suboru; i++)
        {
             String s=reader.readLine();
             if(i==Pozadovany_riadok)
             {
                text_riadka=s;
             }

        }

}catch(Exception e){e.printStackTrace();}

Trocha nepraktické ale hádam pôjde :-)

 
Nahoru Odpovědět
28.7.2015 18:52
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Martin Bartoš
Jan Vargovský:28.7.2015 19:01

Takže se zeptáš streamu n-krát, jestli má ještě řádek, on ti pak řekne u n+1 pokusu, že nemá a ty se ho ještě n krát budeš zkusit přesvědčit, jestli tam fakt nic nemá? Tohle fungovat opravdu nebude :D

 
Nahoru Odpovědět
28.7.2015 19:01
Avatar
Odpovídá na Jan Vargovský
Martin Bartoš:28.7.2015 19:12

Ani nefunguje :-D , Nejako som to nepremyslel :-`

 
Nahoru Odpovědět
28.7.2015 19:12
Avatar
Odpovídá na Petr Štechmüller
Michal Žůrek - misaz:28.7.2015 19:15

to sice vypadá elegantně, ale je to dost hnusné. protože toto načte do paměti všechny řádky.

 
Nahoru Odpovědět
28.7.2015 19:15
Avatar
Martin Bartoš:28.7.2015 19:27

Oprava toho hore:

 while(reader.readLine() != null)
{
           pocet_riadkov_suboru++;
           System.out.println(pocet_riadkov_suboru);
           String s=reader.readLine();
           if(pocet_riadkov_suboru==Pozadovany riadok)
           {
                   text_riadka=s;
                   break;
           }
}

Tentoraz odskúšané ;-)

 
Nahoru Odpovědět
28.7.2015 19:27
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Martin Bartoš
Jan Vargovský:28.7.2015 19:33

Nešlo by to zkrátit? :)

 
Nahoru Odpovědět
28.7.2015 19:33
Avatar
Odpovídá na Jan Vargovský
Martin Bartoš:28.7.2015 19:39

Určite hej, ale nenapadá mňa :-D

 
Nahoru Odpovědět
28.7.2015 19:39
Avatar
Odpovídá na Martin Bartoš
Michal Žůrek - misaz:28.7.2015 19:48

to ale podle mě nebude fungovat, nevrátí to 555 řádek ale 1110 řádek. readLine přečte řádek a ty ho v jedné iteraci voláš 2× (v podmínce cyklu a při ukládání do proměnné s)

 
Nahoru Odpovědět
28.7.2015 19:48
Avatar
Michal Žůrek - misaz:28.7.2015 19:51

a co to napsat jednoduše

int hleadanyRadek = 555;
for (int i = 0; i < hleadnyRadek - 1; i++) {
        if (reader.readLine() == null) {
                return null;
        }
}
return reader.readLine();
 
Nahoru Odpovědět
28.7.2015 19:51
Avatar
Odpovídá na Michal Žůrek - misaz
Michal Žůrek - misaz:28.7.2015 19:53

i když ta podmínky v cyklu je zbytečná.... Po úpravě:

int hleadanyRadek = 555;
for (int i = 0; i < hleadnyRadek - 1; i++) {
        reader.readLine();
}
return reader.readLine();
 
Nahoru Odpovědět
28.7.2015 19:53
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Michal Žůrek - misaz
Jan Vargovský:28.7.2015 20:00
while(hledanyRadek-->0) reader.readLine();
return reader.readLine();

Otázka je, jak se chová stream v Javě, když už jsi na konci a pořád po něm něco chceš :)

 
Nahoru Odpovědět
28.7.2015 20:00
Avatar
Odpovídá na Jan Vargovský
Michal Žůrek - misaz:28.7.2015 20:04

to je sice krátké, ale pak už nemůžeš pracovat s proměnnou hledanyRadek. Osobně takové řešení nemám moc rád.

 
Nahoru Odpovědět
28.7.2015 20:04
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Michal Žůrek - misaz
Jan Vargovský:28.7.2015 20:12

Já myslel, že zadání bylo jen získat daný řádek ze souboru.

 
Nahoru Odpovědět
28.7.2015 20:12
Avatar
ronep
Člen
Avatar
ronep:3.9.2015 1:27

ok diky moc za mnoztvo napadou
a ano ide mi len o to nacitat ten dani riadok a nic viac ale asi mi nedoslo ktore z tich vsetkych rieseni je spravne tak viskusam vsetky :)
a je zaujimave ako tagmer vsade ste davali priamo riadok cislo 555 aj ked to bolo prve velke cislo co som natukal
jo a ten return je aky datovi tip ? alebo je to podla toho do akeho datoveho tipu ho necham vratit ?

 
Nahoru Odpovědět
3.9.2015 1:27
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 19 zpráv z 19.