Avatar
Rasto
Redaktor
Avatar
Rasto:

Ahojte,
vedel by mi niekto skuseny vysvetlit, preco txt file, z ktoreho citam data, musi mat presne 3 prazdne riadky medzi jednotlivymi sekciami ?

Moj program cita riadky z txt suboru. Ked narazi na urcitu znacku (cislo), kazdy dalsi riadok sa nacita do vlastnej premennej. Vsetko funguje spravne iba vtedy, ked su tam presne 3 prazdne riadky medzi jednotlivymi sekciami v txt subore, ktore su oddelene cislami.
Chcel by som pochopit, preco je to tak.

txt subor ma takuto strukturu:
1
r
riadok textu
riadok textu
riadok textu
riadok textu
riadok textu

2
a
riadok textu
riadok textu
riadok textu
riadok textu
riadok textu

Medzi sekciami oznacenymi 1 a 2 musia byt presne 3 medzery, aby to kod nacital spravne.
Ukazka kodu:

inpStream = getClass().get­ResourceAsStre­am("/resources/Sce­nare.txt");

try (BufferedReader reader = new BufferedReader(new InputStreamRe­ader(inpStream,"UTF-16BE"))){
do{
cislo = Integer.toStrin­g(a);
riadok = reader.readLine();
if(riadok.equ­als(cislo)){
kto = reader.readLine();
znenie = reader.readLine();
cislaSpokojnosti = reader.readLine();
cislaSily = reader.readLine();
cislaSpokojnostiNie = reader.readLine();
cislaPokladne = reader.readLine();
break;
}
} while(!riadok­.equals(cislo) && (riadok = reader.readLine()) != null );
}
catch(IOException e){}

Editováno 18.8.2014 22:28
 
Odpovědět 18.8.2014 22:26
Avatar
Odpovídá na Rasto
Neaktivní uživatel:

Študovať ten program čo si postol sa asi nebude chcieť nikomu, každopádne to čo potrebuješ by som vyriešil nejako takto (pre jednoduchosť sú jednotlivé riadky ukladané do ArrayListu).

package filetest;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;

public class FileTest {
    public static void main(String[] args){
        File file = new File("file.txt");
        if (!file.exists())
            System.out.println("File does not exist");

        ArrayList<String> rowsFromFile = new ArrayList<>();
        try (Scanner inputFromFile = new Scanner(file)) {
            while (inputFromFile.hasNext()) {
                for (int i = 0; i < 7; i++)
                    rowsFromFile.add(inputFromFile.nextLine());
            }
        }catch(FileNotFoundException e){
            System.err.println("Error: " + e.getMessage());
        }

        for (String s : rowsFromFile)
            System.out.println(s);
    }
}

Pozn. 1. Keď poznáš štruktúru súboru, tak nemá moc zmysel vymýšlať neviem aké podmienky, v podstate tam tie čísla ani nepotrebuješ.
2. Namiesto milion premených pre jednotlivé riadky by som použil nejakú kolekciu (HashMap napr. čo je v podstate asociatívne pole)

Editováno 18.8.2014 23:15
Nahoru Odpovědět 18.8.2014 23:13
Neaktivní uživatelský účet
Avatar
Vojtěch Pospíchal:

Hlavní je, jestli by nebylo efektivnější to udělat pomocí XML. Na parsování z XML jsou miliardy velmi kvalitních knihoven + by to zpřehlednilo výsledný soubor.

 
Nahoru Odpovědět 19.8.2014 1:46
Avatar
mkub
Redaktor
Avatar
Odpovídá na Rasto
mkub:

na vkladanie kodu mas tu tlacitko s nazvom "Vlozit kod", ked na to kliknes, tak sa ti vlozi parovy tag, do ktoreho nasledne vlozis svoj kusok kodu a potom sa zachova formatovanie toho kodu, ako aj sa zvyrazni mierne syntax
cize odporucam ti pouzivat to tlacitko, ked vkladas nejaky ten kod

 
Nahoru Odpovědět 19.8.2014 9:55
Avatar
Rasto
Redaktor
Avatar
Rasto:

Ahojte,

dakujem za vsetky pripomineky a komentare.
Riesenie s ArrayListom je elegatne, ale fakt je ten, ze potrebujem samostatne Stringy, lebo tie inde v kode potom cez StringTokenizer dalej spracovavam.

Na inom fore ma upozornili nja logicku chybu v citani dokumentu, resp na duplicitne volanie readLine(), ktore sposobovalo, ze sa cital defacto kazdy druhy riadok...
Som samouk a amater ale aj tak sa hanbim, ze som si to nevsimol. Tu je prerobeny kod, snad to pomoze aj inym zaciatocnikom. :-) (tentoraz ho vkladam cez tagy:-))

inpStream = getClass().getResourceAsStream("/resources/Scenare.txt");
try (BufferedReader reader = new BufferedReader(new InputStreamReader(inpStream,"UTF-16BE"))){
           cislo = Integer.toString(a);

           while((riadok = reader.readLine()) != null) {

               if(riadok.equals(cislo)){
                 kto = reader.readLine();
                 znenie = reader.readLine();
                 cislaSpokojnosti = reader.readLine();
                 cislaSily = reader.readLine();
                 cislaSpokojnostiNie = reader.readLine();
                 cislaPokladne = reader.readLine();
                 break;
             }
           }
       }
       catch(IOException e){}
 
Nahoru Odpovědět 19.8.2014 17:22
Avatar
sisolpes
Člen
Avatar
Odpovídá na Rasto
sisolpes:

Úplně jsem tvoji potíž nepochopil, ale snad ti pomůže toto (používám balíček nio - novinka v Javě 7)

public ArrayList<String> přečti(String cestaksouboru) throws IOException {
                String dato;
                data = new ArrayList<String>();

                čti = Files.newBufferedReader(Paths.get(cestaksouboru), Charset.defaultCharset());

                while (!((dato = (čti.readLine())) == null)) {
                                data.add(dato);
                        }

                return data;
        }
Nahoru Odpovědět 19.8.2014 18:58
Alt + 2
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 6 zpráv z 6.