Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 20
  1. #1

    [JAVA] Aiuto lettura archivio txt

    Salve a tutti, sto creando un progetto universitario che consiste nella realizzazione di un sistema di gestione di un'agenzia di viaggi. I dati principali sono tre (clienti, prenotazioni, pacchetti vacanze) e sono tutti salvati su un semplice file di testo. Siccome bisogna operare sul suddetto txt, ho creato inanzitutto una classe letturaDB che mi permette (teoricamente) di leggere tutto quanto il file e costruirmi gli ArrayList di clienti, prenotazioni e pacchetti in modo da gestirli più facilmente. La classe è la seguente:
    [SPOILER]
    codice:
    public class letturaDB {
        
        
        public static void lettura(String pathname) throws Exception{
            try{
                Scanner sc = new Scanner(pathname);
                ArrayList<Pacchetto> pacchetti = new ArrayList<Pacchetto>();
                ArrayList<Cliente> clienti = new ArrayList<Cliente>();
                ArrayList<Prenotazione> prenotazioni = new ArrayList<Prenotazione>();
                String temp;
                while(sc.hasNextLine()){
                    temp=sc.nextLine();
                    if(temp.equals("PACCHETTO"))
                        pacchetti=readPacchetti(sc); 
                    else if(temp.equals("CLIENTI"))
                        clienti=readClienti(sc);
                    else if(temp.equals("PRENOTAZIONI"))
                        prenotazioni=readPren(sc);
                    else
                        throw new Exception("Il file selezionato non è corretto");                
                }
            } catch(Exception e){
                throw new IOException("Errore");
            }
            
        }
        
        public static Pacchetto leggiPacchetto(Scanner sc){
            String nome, indirizzo, temp;
            //ArrayList<String> t = new ArrayList<String>();
            ArrayList<Settimana> s = new ArrayList<Settimana>();
            temp=sc.nextLine();
            nome=temp;
            temp=sc.nextLine();
            indirizzo=temp;
            temp=sc.nextLine();
            String[] tel = temp.split(";"); 
            ArrayList<String> t= new ArrayList<String>(Arrays.asList(tel)); //copia l'array tel nell'arrayList t
            temp=sc.nextLine();
            s=readSettimane(sc);
            return new Pacchetto(nome,indirizzo,t,s);
        }
        
         public static ArrayList<Pacchetto> readPacchetti(Scanner sc){
            ArrayList<Pacchetto> p = new ArrayList<Pacchetto>();
            //finchè non incontro una stringa PACCHETTO o CLIENTI...
            while(!(sc.nextLine().equals("PACCHETTO") || sc.nextLine().equals("CLIENTI")))
                p.add(leggiPacchetto(sc));
            
            return p;
        }
        
        public static Settimana leggiSettimana(Scanner sc){
            int nsett, nsd, psd, nsu, psu;
            String seq, temp;
            temp=sc.nextLine();
            String[] result = temp.split(";");
            nsett=Integer.parseInt(result[0]);
            nsd=Integer.parseInt(result[1]);
            psd=Integer.parseInt(result[2]);
            nsu=Integer.parseInt(result[3]);
            psu=Integer.parseInt(result[4]);
            seq=result[5];
            temp=sc.nextLine();
            String[] result2 = temp.split(";");
            Queue<String> coda = new LinkedList<String>(Arrays.asList(result2));
            return new Settimana(nsett,nsd,psd,nsu,psu,seq,coda);
        }
        
        public static ArrayList<Settimana> readSettimane(Scanner sc){
            ArrayList<Settimana> x = new ArrayList<Settimana>();
            while(!(sc.nextLine().equals("PACCHETTO") || sc.nextLine().equals("CLIENTI")))
                x.add(leggiSettimana(sc));
            return x;
        }
         
        public static Cliente leggiCliente(Scanner sc){
            String cognome, nome, telefono, carta, temp;
            temp=sc.nextLine();
            String[] result = temp.split(";");
            cognome=result[0];
            nome=result[1];
            telefono=result[2];
            carta=result[3];
            return new Cliente(cognome,nome,telefono,carta);
        }
        
        public static ArrayList<Cliente> readClienti(Scanner sc){
            ArrayList<Cliente> c = new ArrayList<Cliente>();
            while(!(sc.nextLine().equals("PRENOTAZIONI")))
                c.add(leggiCliente(sc));
            return c;
        }
        
        public static Prenotazione leggiPren(Scanner sc){
            String villaggio, cognome, nome, stanza, corsi, temp;
            int settimana;
            temp=sc.nextLine();
            //se la linea letto contiene la stringa PRENOTAZIONI
            //passo alla linea successiva per continuare  a
            //leggere le prenotazioni
            if(temp.equals("PRENOTAZIONI"))
                temp=sc.nextLine();
            villaggio=temp;
            temp=sc.nextLine();
            String[] result = temp.split(";");
            settimana=Integer.parseInt(result[0]);
            cognome=result[1];
            nome=result[2];
            stanza=result[3];
            corsi=result[4];
            return new Prenotazione(villaggio,settimana,cognome,nome,stanza,corsi);
        }
        
        public static ArrayList<Prenotazione> readPren(Scanner sc){
            ArrayList<Prenotazione> p = new ArrayList<Prenotazione>();
            while(sc.hasNextLine())
                p.add(leggiPren(sc));
            return p;
        }
    }
    [/SPOILER]
    Per farvi un'idea di come dev'essere il file del database ve lo incollo nello spoiler sottostante:
    [SPOILER]PACCHETTO
    CubMed Lampedusa
    Lampedusa, piazza Centrale
    087 8989898;087 5656655
    1;20;80;7;140;TSB

    2;3;80;7;140;TSB

    3;3;80;7;140;TSB

    4;3;80;7;140;TSB

    5;3;80;7;140;TSB

    6;3;80;7;140;TSB

    7;3;80;7;140;TSB

    8;3;80;7;140;TSB

    9;3;80;7;140;TSB

    10;3;80;7;140;TSB

    11;3;80;7;140;TSB

    12;3;80;7;140;TSB

    13;3;80;7;140;TSB

    14;3;80;7;140;TSB

    15;3;80;7;140;TSB

    16;3;80;7;140;TSB

    17;4;100;25;180;VTSB

    18;4;100;25;180;VTSB

    19;4;100;25;180;VTSB

    20;4;100;25;180;VTSB

    21;4;100;25;180;VTSB

    22;4;120;30;200;VETSB

    23;4;120;30;200;VETSB

    24;4;120;30;200;VETSB

    25;4;120;30;200;VETSB
    De Fabbris;Bluastri
    26;3;150;30;220;VETSB

    27;3;150;30;220;VETSB

    28;4;150;30;220;VETSB
    Calzolari;Fornaioli;Mulinello
    29;4;150;30;220;VETSB

    30;4;150;30;220;VETSB

    31;4;150;30;220;VETSB

    32;4;150;30;220;VETSB

    33;4;150;30;220;VETSB

    34;3;120;20;180;TSB

    35;3;120;20;180;TSB

    36;3;120;20;180;TSB

    37;3;120;20;180;TSB

    38;3;120;20;180;TSB

    39;3;120;20;180;TSB

    40;2;100;14;150;TSB

    41;2;100;14;150;TSB

    42;2;100;14;150;TSB

    43;2;100;14;150;TSB

    44;2;100;14;150;TSB

    45;2;100;14;150;TSB

    46;2;100;14;150;TSB

    47;0;100;4;130;T

    48;0;100;4;130;T

    49;0;100;0;130;

    50;0;100;0;130;

    51;0;100;0;130;

    52;0;100;0;130;

    PACCHETTO
    ValTur Porto Cervo
    Porto Cervo, zona Centrale
    096 56545445
    1;2;80;7;140;TSB

    2;2;80;7;140;TSB

    3;2;80;7;140;TSB

    4;2;80;7;140;TSB

    5;2;80;7;140;TSB

    6;2;80;7;140;TSB

    7;2;80;7;140;TSB

    8;2;80;7;140;TSB

    9;2;80;7;140;TSB

    10;2;80;7;140;TSB

    11;2;80;7;140;TSB

    12;2;80;7;140;TSB

    13;2;80;7;140;TSB

    14;2;80;7;140;TSB

    15;2;80;7;140;TSB

    16;2;80;7;140;TSB

    17;4;100;25;180;VTSB

    18;4;100;25;180;VTSB

    19;4;100;25;180;VTSB

    20;4;100;25;180;VTSB

    21;4;100;25;180;VTSB

    22;4;120;30;200;VETSB

    23;4;120;30;200;VETSB

    24;4;120;30;200;VETSB

    25;4;120;30;200;VETSB

    26;3;150;30;220;VETSB
    Tulipani
    27;3;150;30;220;VETSB

    28;3;150;30;220;VETSB

    29;3;150;30;220;VETSB
    De Garofali;Gardenia
    30;4;150;30;220;VETSB

    31;4;150;30;220;VETSB

    32;4;150;30;220;VETSB

    33;4;150;30;220;VETSB

    34;3;120;20;180;TSB

    35;3;120;20;180;TSB

    36;3;120;20;180;TSB

    37;3;120;20;180;TSB

    38;3;120;20;180;TSB

    39;3;120;20;180;TSB

    40;2;100;14;150;TSB

    41;2;100;14;150;TSB

    42;2;100;14;150;TSB

    43;2;100;14;150;TSB

    44;2;100;14;150;TSB

    45;2;100;14;150;TSB

    46;2;100;14;150;TSB

    47;0;100;4;130;T

    48;0;100;4;130;T

    49;0;100;0;130;

    50;0;100;0;130;

    51;0;100;0;130;

    52;0;100;0;130;

    CLIENTI
    Rossi;Mario;06987675;VISA4986754435540032
    De Luca;Lucia;078956454;MASTERCARD4999954435540777
    Verdi;Gian Carlo;3456435466;VISA49999544355499988
    Bruni;Giorgia;566876876;VISA87867678754345678
    Di Colore;Viola;787443455;MASTERCARD7865654534567676
    Violetti;Ciro;798709878907;AURORA786467656768999
    Bluastri;Calogero;666767766;ALBA98900000000045
    Degli Aranci;Olivia;787887878778;FINEC8989998767540098
    Gialli;Ugo;787987987;FIN6765000000098765
    Bianchi;Nerina;68768689;VISA9878987604090099
    Grigio;Perla;25435435;VISA234567654567890
    Marrone;Chiara;2636363636;VISA1234567890234567
    De Fabbris;Michele;6869898787;VISA1234456567654567
    Calzolari;Maria;798798779;MASTERCARD89878974319876 54
    Fornaioli;Luca;79879870;FFF8765643456093468
    Mulinello;Lia;69879870;VISA1234987698345829
    Tulipani;Emilio;967987979;VISA2020987654591296
    De Garofali;Fiore;70978098089;VISA2340986398293749
    Gardenia;Andrea;67987098089;MATERCARD9876920398563 781
    PRENOTAZIONI
    CubMed Lampedusa
    5;Verdi;Gian Carlo;D;S
    28;Verdi;Gian Carlo;D;TB
    28;Di Colore;Viola;D;B
    28;Bluastri;Calogero;D;
    28;Rossi;Mario;D;VB
    25;Di Colore;Viola;D;B
    25;Degli Aranci;Olivia;D;T
    28;Violetti;Ciro;S;VETSB
    25;Bruni;Giorgia;D;VBT
    25;De Luca;Lucia;D;
    27;Gialli;Ugo;D;BE
    PRENOTAZIONI
    ValTur Porto Cervo
    30;Degli Aranci;Olivia;S;B
    26;Gialli;Ugo;D;T
    29;Verdi;Gian Carlo;S;V
    26;Grigio;Perla;D;SV
    26;Marrone;Chiara;D;
    29;Rossi;Mario;D;VSBET
    29;De Luca;Lucia;D;BE
    29;Di Colore;Viola;D;BS[/SPOILER]

    Perchè però una volta richiamato il metodo lettura non mi legge correttamente il file? C'è qualcosa di errato?
    Grazie in anticipo a tutti quanti quelli che mi daranno una mano.

    PS: L'acquisizione del file avviene tramite jFileChooser

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    e quele è l'errore?
    RTFM Read That F*** Manual!!!

  3. #3
    Originariamente inviato da valia
    e quele è l'errore?
    Non ci sono errori in compilazione, ma richiamando il metodo lettura nell'interfaccia grafica e provando a stampare qualcosa (in una semplice jTextArea) non stampa niente; per questo mi chiedevo se il codice fosse giusto o ci fosse qualche falla.

    Un altro problema che incontro è sul pathname del file: nel classe adibita all'interfaccia grafica ho inserito il seguente codice per far sì che all'apertura del programma visualizzi direttamente il jFileChooser:
    codice:
    String dbAddress;
            JFileChooser chooser = new JFileChooser ();
            chooser.addChoosableFileFilter (new FileNameExtensionFilter ("File txt","txt"));
            chooser.setDialogTitle("Scegli il database");
            Component parent = null;
    	int returnVal = chooser.showOpenDialog(parent);
    	if (returnVal == JFileChooser.APPROVE_OPTION) {
                dbAddress=chooser.getSelectedFile().getAbsolutePath();
    	}else{
                JOptionPane.showMessageDialog(null,"Non hai selezionato nessun database, il programma terminerà automaticamente.");
                System.exit(0);
    	}
    Purtroppo quando ricreo un riferimento al file con Scanner
    codice:
    Scanner sc = new Scanner(dbAddress);
    mi dice dbAddress:cannot find simbol. Soluzioni?

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    ti chiedevo l'errore inteso come anomalia, per avere un punto di inizio e non dover riprodurre subito noi tutto il tuo environment per vedere poi cosa?
    Se tu mi dici che non vedi l'output è un punto di inizio, significa che il tuo programma è sintatticamente corretto, ma semanticamente qualcosa non va.

    codice:
    //[....]
    while(sc.hasNextLine()){
                    temp=sc.nextLine();
                    if(temp.equals("PACCHETTO"))
                        pacchetti=readPacchetti(sc); 
                    else if(temp.equals("CLIENTI"))
                        clienti=readClienti(sc);
                    else if(temp.equals("PRENOTAZIONI"))
                        prenotazioni=readPren(sc);
                    else
                        throw new Exception("Il file selezionato non è corretto");                
                }
    //[....]
     public static ArrayList<Prenotazione> readPren(Scanner sc){
            ArrayList<Prenotazione> p = new ArrayList<Prenotazione>();
            while(sc.hasNextLine())
                p.add(leggiPren(sc));
            return p;
        }
    sarebbe meglio fare una roba del genere

    codice:
    //[....]
    while(sc.hasNextLine()){
                    temp=sc.nextLine();
                    if(temp.equals("PACCHETTO"))
                        pacchetti.addAll(readPacchetti(sc)); 
                    else if(temp.equals("CLIENTI"))
                        clienti.addAll(readClienti(sc));
                    else if(temp.equals("PRENOTAZIONI"))
                        prenotazioni.addAll(readPren(sc));
                    else
                        throw new Exception("Il file selezionato non è corretto");                
                }
    //[....]

    dovrebbe andare, ho l'impressione che tieni conto solo dell'ultimo elemento (tanto per iniziare).

    Poi una domanda: tu nel file, metti le prenotazioni tutte insieme, i clienti tutti insieme ecc o puoi cambiare l'ordine di ognuna?

    infine cannot find symbol in genere si riferisce al fatto che tu hai una variabile pippo ma per questioni di scope il tuo blocco la vede inesistente.
    Ricontrolla la definzione

    ps il tuo codice io non l'ho testato, queste sono cose che mi vengono solo LEGGENDO quello che tu hai scritto
    RTFM Read That F*** Manual!!!

  5. #5
    Originariamente inviato da valia
    Poi una domanda: tu nel file, metti le prenotazioni tutte insieme, i clienti tutti insieme ecc o puoi cambiare l'ordine di ognuna?
    No, l'ordine sarà sempre quello, proprio come nell'esempio di file che ho inserito nel primo post.

    Originariamente inviato da valia
    infine cannot find symbol in genere si riferisce al fatto che tu hai una variabile pippo ma per questioni di scope il tuo blocco la vede inesistente.
    Ricontrolla la definzione
    Dovrei aver risolto almeno questo: la variabile era stata definita solo all'interno del metodo con il jFileChooser, e non risultava quindi "a disposizione" di tutti i metodi della classe

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    ok e ci siamo, riguardo alla lettura fai una roba (se non funziona) via via che leggi fatti stampare a video il valore, in modo da vedere se ci entri o no nel ciclo.
    Se non lo trovi poi in output, probabile qualcosa si è perso (ma se lo hai letto è già qualcosa)
    RTFM Read That F*** Manual!!!

  7. #7
    Originariamente inviato da valia
    ok e ci siamo, riguardo alla lettura fai una roba (se non funziona) via via che leggi fatti stampare a video il valore, in modo da vedere se ci entri o no nel ciclo.
    Se non lo trovi poi in output, probabile qualcosa si è perso (ma se lo hai letto è già qualcosa)
    Continuo a non leggere correttamente il file: ho provato ad associare alla pressione di un tasto un jOptionPane per vedere se riesco a stampare il cognome del primo cliente in questo modo:
    codice:
    private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {                                      
                   Scanner sc = new Scanner(dbAddress);
                   Cliente c;
                   c=letturaDB.leggiCliente(sc);
                   JOptionPane.showMessageDialog(null,c.cognome);
    }
    Eppure al click sul bottone non succede niente, anzi, nella finestrella dell'output mi compare:
    Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 1
    con una sfilza di altri errori.
    Sto seriamente pensando che il problema si trovi nel metodo per leggere il file....

    EDIT: anche con una semplice stampa a video con println() l'output dà la stessa eccezione

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    questo errore

    codice:
    Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 1
    ti dice che accedi ad una locazione sbagliata di una collection.

    Ti dirà anche il numero di riga in cui si verifica, guarda cosa fai a quella riga e probabilmente tenti l'accesso ad un array vuoto
    RTFM Read That F*** Manual!!!

  9. #9
    Originariamente inviato da valia
    questo errore

    codice:
    Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 1
    ti dice che accedi ad una locazione sbagliata di una collection.

    Ti dirà anche il numero di riga in cui si verifica, guarda cosa fai a quella riga e probabilmente tenti l'accesso ad un array vuoto
    Mi dava errore perchè dopo aver creato l'oggetto di tipo Scanner, l'ho passato alla funzione leggiCliente che però parte subito a leggere sc.nextLine(), senza controllare che la stringa corretta sia CLIENTI: in questo caso si ritrovava a leggere la stringa PACCHETTO e faceva un split(" ; ") che ovviamente però ritornava un array di String vuoto; cercando quindi di stampare un array vuoto, mi lanciava quell'eccezione.
    Dopo aver aggiunto un controllo per far arrivare sc.nextLine() fino alla stringa CLIENTI, richiamo leggiClienti(sc) ma ora lancia NoSuchElementException con errori
    at java.util.Scanner.nextLine(Scanner.java:1516)
    at progetto.letturaDB.leggiPacchetto(letturaDB.java:5 5)
    e diverse altre....Sto impazzendo....

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    perché non c'è nessun elemento!!!
    un consiglio, prova un attimo a dividere i file.
    Prova a fare una lettura di 3 file differenti, uno per clienti, uno per prenotazioni e via di seguito.
    Quindi dentro il file clienti metti solo il db dei clienti.

    supponi quindi di aprire il file clienti.txt

    codice:
     public static void lettura(String pathname) throws Exception{
            try{
                Scanner sc = new Scanner(pathname);
                ArrayList<Cliente> clienti = new ArrayList<Cliente>();
                String temp;
    	     String tempbuff[]; 
                while(sc.hasNextLine()){
                    temp=sc.nextLine();
    		tempbuff = temp.split(";");
    		if (tempbuff.length == 4) {
    			client.add(new Cliente(tempbuff[0],tempbuff[1],tempbuff[2], tempbuff[3]));
    		}			
                }
            } catch(Exception e){
                throw new IOException("Errore");
            }
            
        }
    prova questo pezzo di codice.

    Il mio scopo è far funzionare un pezzo piccolo e vedere di metterlo nel sistema globale
    RTFM Read That F*** Manual!!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.