Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442

    Estrarre dati da file txt

    Ciao, sto facendo un piccolo esperimento.
    Ho un file txt così composto:

    2013-06-14 13:13:41 startup archives unpack
    2013-06-14 13:13:43 install desktop-base <none> 6.0.7ubuntu1
    2013-06-14 13:13:43 status half-installed desktop-base 6.0.7ubuntu1
    2013-06-14 13:13:43 status triggers-pending hicolor-icon-theme 0.12-1ubuntu2
    2013-06-14 13:13:43 status half-installed desktop-base 6.0.7ubuntu1
    [...]

    Il mio obietto è creare un altro file txt dove sono presenti solo le righe che contengono la parola "install", tipo:
    2013-06-14 13:13:43 install desktop-base <none> 6.0.7ubuntu1


    Ho fatto questo tentativo (tralascio per semplicità le parti meno utili):

    codice:
    public class LeggiFile {
    
        private static ArrayList<Righe> listRighe= new ArrayList<Righe>();
    
        public static void main(String[] args) {
         
            try {
    
                Scanner scan = new Scanner(new File("Gnome.txt"));
    
                while (scan.hasNext()) {
                    String str1 = scan.next();
                    String str2 = scan.next();
                    String str3 = scan.next();
                    String str4 = scan.next();
                    String str5 = scan.next();
                    String str6 = scan.next();
                    if ("install".equals(str3)) {
                        listRighe.add(new Righe(str1, str2, str3, str4, str5, str6));
                    }
                }
                scan.close();
            } catch (FileNotFoundException e) {
                System.out.println("File non trovato");
            }
            
            try {
    	      FileOutputStream fos = new FileOutputStream("pippoMod.txt");
    	      PrintStream stream = new PrintStream(fos);
                  stream.println(listRighe);
    	   }
    	   catch (IOException e)
    	   {
    	      System.out.println("Errore: " + e.getMessage());
    	      System.exit(-1);
    	   }
        }
    }
    Seguendo questa logica: scansiono il file di ingresso immettendo tutti i token in un arraylist di stringhe, poi scrivo i token che soddisfano il requisito nel nuovo file.

    Problemi:
    1) Non tutte le righe hanno lo stesso numero di "stringhe" (dove per stringa intendo una sequenza di caratteri senza spazi, quindi i separatori sono gli spazi) quindi ovviamente così com'e' mi dà errore. Come si risolve questa cosa?
    2) Anche isolando le righe più lunghe e lasciando solo tutte righe con lo stesso numero di stringhe, nel file nuovo che scrivo tutte le stringhe sono scritte sequenzialmente, senza interruzione di linea per capirci.

    Come potrei risolvere?
    Non voglio la soluzione pronta, soltanto un aiuto che mi indirizzi...

    Grazie!

  2. #2
    Ciao,
    1) perché non ti crei un array di stringhe?
    poi lo dai in "pasto" a Righe a cui non interesserà la dimensione.

    2) prova ad aggiungere
    codice:
    stream.println(listRighe);
    stream.println('\n');
    con la seconda riha dovrebbe andarti a capo
    inoltre non dimenticare mail il
    codice:
    stream.flush();
    che si mette alla fine per forzare il caricamento del dato nel file e pulire lo stream.

    Ciao
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755
    Io farei una cosa del genere:

    codice:
    Scanner scanner = new Scanner (new File (nomeFile));
    String s;
    while (scanner.hasNextLine ()) {
       s = scanner.nextLine ();
       if (s.indexOf ("install") >= 0) {
         //E' una riga da scrivere sul nuovo file
       }
    }
    Una volta entrato nell'if sai che quella riga va scritta sul nuovo file , quindi puoi procedere con la sovrascrittura del file ogni qualvolta trovi una nuova riga oppure , opzione più efficiente , crei ad esempio uno StringBuilder nel quale aggiungi ogni volta le righe da scrivere e alla fine del ciclo while procedi con una unica scrittura del nuovo file con il contenuto dello StringBuilder.



  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Originariamente inviato da schumy2000
    Ciao,
    1) perché non ti crei un array di stringhe?
    poi lo dai in "pasto" a Righe a cui non interesserà la dimensione.
    ? non è quello che ho fatto? ho creato un arraylist di stringhe...
    la classe Righe è così composta:

    codice:
    public class Righe {
        private String str1;
        private String str2;
    [ecc..]
        public Righe (String str1, String str2, String str3, String str4, String str5, String str6) {
            this.str1=str1;
            this.str2=str2;
    [ecc...]
        }
        //metodo che sovrascrive il toString di object per stampare l'arraylist
        @Override
        public String toString() {
            return str1 + " " + str2 + " " + str3 + " " + str4 + " " + str5 + " " + str6 + " ";
        }
        //metodi estrattori
        public String getStr1() {
            return str1;
        }
        public String getStr2() {
            return str2;
        } [ecc...]
    }

    inoltre non dimenticare mail il
    codice:
    stream.flush();
    che si mette alla fine per forzare il caricamento del dato nel file e pulire lo stream.
    per forza intendi che lo fa anche se incontra una condizione di errore?
    che cosa vuol dire pulire lo stream?

    grazie!

    edit: ho risolto il problema n. 2 semplicemente mettendo un + '\n' al metodo che riscrive toString nella classe Righe (quello che mi hai scritto tu non ha funzionato). Però non ho capito perché mi mette una , all'inizio di ogni riga e all'inizio di tutto il blocco una parentesi quadra (e un'altra alla fine).

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Ok forse ci siamo ho risolto il problema n. 1 (grazie all'amico zipangulu ) ma si è ripresentato il n. 2 (cioè nel file creato le linee sono tutte consecutive separate solo da una virgola, in piu' ci sono sempre le famose parentesi quadre) perché non faccio piu' uso della classe Righe e suo relativo costruttore:

    codice:
    public class LeggiFile {
        private static ArrayList<String> listRighe = new ArrayList<>();
        public static void main(String[] args) {
            try {
                Scanner scanner = new Scanner(new File("Gnome.txt"));
                String s;
                while (scanner.hasNextLine()) {
                    s = scanner.nextLine();
                    if (s.indexOf("install ") >= 0) {
                        listRighe.add(s);
                    }
                }
                scanner.close();
            }
            catch (FileNotFoundException e) {
                System.out.println("File non trovato");
            }
            try {
                FileWriter fos = new FileWriter("pippoMod.txt");
                PrintWriter stream = new PrintWriter(fos);
                stream.println(listRighe);
                stream.close();
            } catch (IOException e) {
                System.out.println("Errore: " + e.getMessage());
                System.exit(-1);
            }
    
        }
    }
    Si noti la finezza dello spazio aggiunto dopo 'install' nella riga if (s.indexOf("install ") >= 0)
    Eh sì perché mi sono accorta che ovviamente senza lo spazio finale mi prendeva anche le righe con 'installed'.
    Con FileWriter si può gestire il fatto che dia un errore/avviso in caso di file già esistente?
    Grazie!

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755
    Originariamente inviato da Jamie04
    Con FileWriter si può gestire il fatto che dia un errore/avviso in caso di file già esistente?
    Grazie!
    Puoi verificare l'esistenza di un file con il metodo "exists" della classe File


  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Ho risolto anche il problema delle righe consecutive aggiungendo questo:
    listRighe.add("\n");

    dopo lo statement listRighe.add(s);

    MA continua a stamparmi pure le virgole a fine e inizio riga, e la parentesi quadra iniziale e finale.
    Come si tolgono?
    Tnx!

  8. #8
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755
    Originariamente inviato da Jamie04
    MA continua a stamparmi pure le virgole a fine e inizio riga, e la parentesi quadra iniziale e finale.
    Come si tolgono?
    Tnx!
    Potresti usare il metodo della classe String "replaceAll" del tipo:

    codice:
    stringa.replacell ("[\\[\\],]" , "");
    Ps. Sopra ho usato una regex (espressione regolare) , non sono ferratissimo a riguardo ma per levare i caratteri '[' ']' e ',' dovrebbe andare bene.


  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    non produce nessun effetto
    e comunque se andasse bene potrebbe avere l'effetto inaspettato di togliere caratteri che magari servono (non è questo il caso, però come linea generale...)
    non riesco a capire il fatto che l'arraylist venga stampato così:
    [stringa,stringa,stringa]

    da "chi" dipende

  10. #10
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755
    Allora , tu da quel che ho capito stai mandando a stampare direttamente la lista , del tipo:
    codice:
    System.out.println (tuaLista);
    Questa procedura ti stampa una stringa con tutti gli elementi nella lista separati da una virgola e contenuti tra le parentesi quadre , è l lista stessa che determina ciò.
    In un post precedente ti avevo suggerito di utilizzare uno StringBuilder per "appendere" tutte le righe con "install" e poi stampare/scrivere su file il contenuto da esso ottenuto come stringa con il metodo "toString ()"..in termini di codice quello che voglio dire io è:

    codice:
    Scanner scanner = new Scanner (new File (pathFile));
    StringBuilder sb = new StringBuilder ();
    String s;
    while (scanner.hasNextLine ()) {
       s = scanner.nextLine ();
       if (s.indexOf ("install ") >= 0) {
          sb.append (s + "\n");
       }
    }
    scanner.close ();
    //IO ORA CONSIDERO LA STAMPA , MA SE DEVI SCRIVERE SU FILE LO ADATTI
    System.out.println (sb.toString ());
    Oppure potresti farti una procedura/metodo che stampi il contenuto della lista ciclandolo e stampando quindi solo i suoi elementi senza l'aggiunta di caratteri per te inutili (vedi le quadre e le virgole)

    Spero di averti chiarito le idee.


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.