Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14

Discussione: validare file di testo

  1. #1
    Utente di HTML.it
    Registrato dal
    May 2005
    Messaggi
    16

    validare file di testo

    ciao a tutti!
    sto impazzendo con una regex per vedere se un file di testo è formattato in un certo modo,potete darmi una mano? Il mio file di testo deve avere questo formato:

    int
    int,double,double,String,int,int,String

    solo che gli ultimi 3 valori della seconda riga possono ripetersi n volte avendo perciò questo formato:

    int
    int,double,double,String,int,int,String,int,int,St ring,int,int,String,int,int,String

    e inoltre la seconda riga può ripetersi nello stesso formato n volte.

    Mi consigliate di usare le regex o procedere analizzando la stringa "manualmente" magari con uno StringTokenizer?

    Grazie

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: validare file di testo

    Originariamente inviato da gioo85
    int
    int,double,double,String,int,int,String,int,int,St ring,int,int,String,int,int,String

    e inoltre la seconda riga può ripetersi nello stesso formato n volte.

    Mi consigliate di usare le regex o procedere analizzando la stringa "manualmente" magari con uno StringTokenizer?
    Se per int e double intendi semplicemente che siano "parsabili" come int o double, secondo me ti conviene spezzare la stringa usando "," come separatore e quindi parsare con parseInt()/parseDouble() i campi numerici e vedere se sbuca fuori o no NumberFormatException.
    Per il fatto che gli ultimi 3 valori possono ripetersi, basta solo fare un ciclo e gestirlo in modo appropriato. Insomma, basta solo ragionare un pochino.

    Fare tutto con una regex sarebbe anche fattibile ma a questo punto bisognerebbe precisare e specificare meglio il pattern di int e double (che se per int è abbastanza facile, per un double lo è di meno!).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2005
    Messaggi
    16
    grazie si infatti avevo pensato alla possibilità di spezzare la stringa ma credevo che una regex fosse stata più semplice. A questo punto procedo "manualmente".

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da gioo85
    credevo che una regex fosse stata più semplice.
    Sarebbe semplice se anche i singoli pattern per int e double fossero semplici. Ma se volessi rappresentare con una regex completamente ed esattamente gli stessi formati che i parseXXX() gestiscono .... sarebbe molto molto più complesso.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    72
    Prova così:
    codice:
         public boolean validate(File file){
             if(!file.isFile())
                 return false;//in alternativa si potrebbe lanciare un'eccezione
             try {
                 FileReader fr = new FileReader(file);
                 BufferedReader br = new BufferedReader(fr);
                 String linea= br.readLine();
                 if(linea==null){
                      br.close();
                     return false;   
                 }    
                 try {
                     Integer.parseInt(linea);
                     linea= br.readLine();
                     if(linea==null){
                        br.close();
                        return false;
                     }
                     while(linea!=null){
                        String[] campi=linea.split(",");
                        
                        if(campi.length<7){
                            br.close();
                            return false;
                        }
                        /*gli ultimi 3 campi della riga possono ripetersi n volte
                         * Il numero minimo di campi nella linea è 7, ma può essere anche 10, 13, 16...
                         * il numero di campi- il numero di campi non duplicabili deve essere multiplo di 3  
                         *
                         */
                        if((campi.length-4)%3!=0){
                            br.close();
                            return false;
                        }
    
                        Integer.parseInt(campi[0]);
                        Double.parseDouble(campi[1]);
                        Double.parseDouble(campi[2]);
                        //elementi[3] è una stringa.. nessun problema
                        int i=4;
                        while(i<campi.length){
                        Integer.parseInt(campi[i]);
                        i++;
                        Integer.parseInt(campi[i]);
                        //elementi[6] è una stringa.. nessun problema
                        i=i+2;
                        }
                        linea=br.readLine();
                     }
                 } catch (NumberFormatException numberFormatException) {
                     br.close();
                     return false;
                 }
                 br.close();     
                 return true;             
             } catch (IOException iOException) {
                 iOException.printStackTrace();
                 return false;
             }
         }
    Fammi sapere se funziona, a un rapido test sembra di sì..

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2005
    Messaggi
    16
    grazie andbin del chiarimento! fr84 ho provato il tuo codice e sembra proprio fare quello che mi serve Ora devo solo modificarlo un pochino e testarlo nei vari casi con calma..grazie mille!!!!!

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da fr84
    Prova così:
    codice:
         public boolean validate(File file){
    ....
    Fammi sapere se funziona, a un rapido test sembra di sì..
    Funzionerà anche .... ma non è scritto come si deve. Troppi br.close() (mai sentito parlare della clausola "finally"??), cattura e gestisce IOException (non dovrebbe a quel livello, dovrebbe farla "uscire"). E se ho capito bene il post iniziale, lui non ha N righe ma ne ha solo 2 con formato differente.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it
    Registrato dal
    May 2005
    Messaggi
    16
    no andbin, io posso avere n righe col formato della seconda riga.
    questo è un esempio di un possibile file di testo nella giusta configurazione:

    3
    1,12.34,32.23,abc abc,7,3,defghi
    2,11.22,16.67,lmnsdsd,3,5,sdfsdsdsdfs,2,6,sdesdfsd
    3,45.22,34.66,sdidsofdssd sd,6,7,er gergg

    l'intero a inizio riga è progressivo e il numero di righe a partire dalla seconda è uguale al numero dell'intero della prima riga.
    Inoltre gli ultimi 3 campi della seconda riga (7,3,defghi) possono essere ripetuti n volte in quel formato (infatti nella terza riga: 3,5,sdfsdsdsdfs,2,6,sdesdfsd cioè due volte la sucessione int,int,string)

    spero di essere stato più chiaro..

  9. #9
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    72
    Originariamente inviato da andbin
    Funzionerà anche .... ma non è scritto come si deve. Troppi br.close() (mai sentito parlare della clausola "finally"??), cattura e gestisce IOException (non dovrebbe a quel livello, dovrebbe farla "uscire".
    si hai ragione.. ho sistemato un pò:
    codice:
        public boolean validate(File file) throws IOException {
            if (!file.isFile())
                return false;//in alternativa si potrebbe lanciare un'eccezione
            FileReader fr = new FileReader(file);
            BufferedReader br = new BufferedReader(fr);
            String linea = br.readLine();
            if (linea == null)
                return false;
            try {
                Integer.parseInt(linea);
                linea = br.readLine();
                if (linea == null)
                    return false;
                while (linea != null) {
                    String[] campi = linea.split(",");
                    if (campi.length < 7)
                        return false;
                    /*gli ultimi 3 campi della riga possono ripetersi n volte
                     * Il numero minimo di campi nella linea è 7, ma può essere anche 10, 13, 16...
                     * il numero di campi- il numero di campi non duplicabili deve essere multiplo di 3  
                     *
                     */
                    if ((campi.length - 4) % 3 != 0)
                        return false;
                    Integer.parseInt(campi[0]);
                    Double.parseDouble(campi[1]);
                    Double.parseDouble(campi[2]);
                    //elementi[3] è una stringa.. nessun problema
                    int i = 4;
                    while (i < campi.length) {
                        Integer.parseInt(campi[i]);
                        i++;
                        Integer.parseInt(campi[i]);
                        //elementi[6] è una stringa.. nessun problema
                        i = i + 2;
                    }
                    linea = br.readLine();
                }
            } catch (NumberFormatException numberFormatException) {
                return false;
            } finally {
                br.close();
            }
            return true;
        }
    Originariamente inviato da gioo85
    no andbin, io posso avere n righe col formato della seconda riga.
    questo è un esempio di un possibile file di testo nella giusta configurazione:

    3
    1,12.34,32.23,abc abc,7,3,defghi
    2,11.22,16.67,lmnsdsd,3,5,sdfsdsdsdfs,2,6,sdesdfsd
    3,45.22,34.66,sdidsofdssd sd,6,7,er gergg
    Ho provato a validare un file di testo scritto così e il risultato è stato positivo

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da gioo85
    no andbin, io posso avere n righe col formato della seconda riga.
    Ok grazie, questo dettaglio non mi era chiaro dal tuo primo post.

    Originariamente inviato da fr84
    ho sistemato un pò:
    No, non ci siamo ancora. Restano ancora "buchi" nella gestione delle eccezioni.

    Giusto per completezza, ecco quello che farei io (l'ho scritto al volo ... non l'ho provato ma dovrebbe essere ok):

    codice:
    public static boolean validaFile(File f) throws IOException {
        FileReader fr = null;
        BufferedReader br = null;
    
        try {
            fr = new FileReader(f);
            br = new BufferedReader(fr);
    
            String linea;
    
            if ((linea = br.readLine()) == null) {
                return false;   // Non è valido, non c'è nemmeno 1 riga!
            }
    
            int numeroLinee = Integer.parseInt(linea);
    
            for (int i = 0; i < numeroLinee; i++) {
                if ((linea = br.readLine()) == null) {
                    return false;   // Non è valido, mancano righe!
                }
    
                String[] elementi = linea.split(",");
    
                if (elementi.length < 7 || (elementi.length-4) % 3 != 0) {
                    return false;   // Non è valido, numero di elementi non corretto!
                }
    
                Integer.parseInt(elementi[0]);
                Double.parseDouble(elementi[1]);
                Double.parseDouble(elementi[2]);
                // elementi[3] è un String, ok.
    
                for (int k = 4; k < elementi.length; k += 3) {
                    Integer.parseInt(elementi[k]);
                    Integer.parseInt(elementi[k+1]);
                    // elementi[k+2] + un String, ok.
                }
            }
    
            if (br.readLine() != null) {
                return false;    // Non è valido, ci sono ancora altre righe al fondo!
            }
    
            return true;   // VALIDO!
        } catch (NumberFormatException e) {
            return false;   // Non è valido, numero malformato!
        } finally {
            if (br != null) {
                br.close();
            } else if (fr != null) {
                fr.close();
            }
        }
    }
    Questo è corretto e prende in considerazione tutti i casi, sia per la validazione del formato, sia per le eccezioni.
    L'ultimo test, quello che verifica se al fondo ci sono altre righe è un qualcosa in più .... si potrebbe anche non fare (dipende ... è importante se al fondo ci sono es. righe vuote o altro?)
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.