Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    4

    [java] eliminazione di righe uguali da un file

    Allora... supponendo di avere un file contenente una sequanza :
    1
    3
    1
    3
    3
    io vorrei creare un nuovo file le cui righe siano solo:
    1
    3

    Il ragionamento seguito e stato di...leggere il file principale tramite un ciclo While per scorrere le righe. Mentre leggo la riga vedo se esiste nel file destinzione ( ke conterrà solo i non doppioni ). Le righe non presenti nel secondo venivano salvate dentro mentre se esistervano veniva saltata l'istruzione di scrittura, ecco il codice:
    codice:
    import java.io.*;
    
    
    class ScritTest
    {
        public static void main (String args[])throws IOException {
            boolean check;
            String rigaV,rigaN;
            FileReader frT = new FileReader("./Text.txt");
            BufferedReader brT = new BufferedReader (fr);
            
            FileWriter fwTN = new FileWriter("./TextNuovo.txt");
            fwTN.write("");
            
    
            
            while((rigaV = br.readLine()) != null){
                System.out.println(rigaV);
                check = false;
                
               FileReader frTN = new FileReader("./TextNuovo.txt");
               BufferedReader brTN = new BufferedReader (frTN);
                
                while((rigaN = brTN.readLine()) != null){ 
         
                    if ((rigaN.compareTo(rigaV)) == 0){
                        check = true;
                    }
                }
                frTN.close();
                
                if ( check == false ){
                   fwTN.write(rigaV);
                   fwTN.write("\r\n");
                    }                              
    
            }
            fwTN.close();
            frT.close();
    
        }
    }
    non capisco perchè non mi entra mai nel While interno, di conseguenza il check rimane sempre a falso e mi stampa pari pari tutte le righe. Sapete dove sbaglio?

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

    Re: [java] eliminazione di righe uguali da un file

    Originariamente inviato da T1zz1
    leggere il file principale tramite un ciclo While per scorrere le righe. Mentre leggo la riga vedo se esiste nel file destinzione
    Sì, concettualmente è ok. Ma a livello pratico è necessario scandire più volte il file di destinazione (senza contare che quando ci scrivi una riga devi per forza flushare l'output, altrimenti rischi di non riuscire a leggere subito tutto).

    L'altra soluzione è tenere in memoria le righe, ad esempio in un "set" (insieme di elementi non duplicati). Se la stringa è già nel set non la devi scrivere, se non c'è la aggiungi al set e la scrivi nel file.

    Chiaramente scegliere una o l'altra soluzione, dipende più che altro da quanto è lungo il file originale e dalle prestazioni che si vuole avere.
    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 L'avatar di Pastore12
    Registrato dal
    Oct 2008
    Messaggi
    1,051
    Mi par di ricordare che un BufferedWriter non scrive immediatamente sul file, ma aspetta finchè non cominciano a girargli. Quando arriva al punto critico scrive.

    Per verificare se questa insinuazione corrisponde a realtà potresti anche scrivere:


    codice:
               while((rigaN = brTN.readLine()) != null){
                    System.out.println ("Riga letta dal brTN: "+rigaN); 
         
                    if (rigaN.equals(rigaV)) {
                        check = true;
                    }
               }
    Ultima cosa: ma perchè fai il controllo leggendo dal secondo file? Non sarebbe meglio memorizzare il contenuto del file in un vettore e poi scriverlo tutto in un colpo?

    Ultimissima cosa: I System.out.println sono una tecnica di debug obsoleta, se vuoi, ma funziona sempre per capire cosa fa il codice.

    edit

    ok. è ufficiale. Per questa volta non occorre che ti stampi le righe lette.
    "Ethics are to me something private. Whenever you use it as an argument for why somebody_else should do something, you’re no longer being ethical, you’re just being a sanctimonious dick-head"
    Linus Torvalds

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Pastore12
    Mi par di ricordare che un BufferedWriter non scrive immediatamente sul file, ma aspetta finchè non cominciano a girargli.
    A parte che lui ha usato FileWriter .... e comunque sarebbe meglio flushare l'output dopo la scrittura di una riga.

    Originariamente inviato da Pastore12
    Non sarebbe meglio memorizzare il contenuto del file in un vettore e poi scriverlo tutto in un colpo?
    Bisognerebbe fare una ricerca lineare nel vettore per vedere se una riga esiste già. Meno peggiore rispetto ad una rilettura del file ... ma sempre ricerca lineare. Per questo ho suggerito un "set".
    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
    Feb 2009
    Messaggi
    4
    Per Pastore: riguardo alla stampa subito dopo il while... l'avvevo messa per controllare il contenuto li... ma era sempre NULL.
    Grazie andrea ci provo subito.

    Edit

    Pero tecnicamente ho bisogno di un vettore, non dico illimitato ma molto grande. Visto che a me servono molte righe da analizzare, per caso esiste qualche funzione/classe che scarica le righe in un array?
    come per esempio Split che scarica tutti i vari tagli in un vettore.

  6. #6
    Utente di HTML.it L'avatar di Pastore12
    Registrato dal
    Oct 2008
    Messaggi
    1,051
    Mi scuso per avermi inventato il BufferedWriter.. comunque il senso era quello..

    Per spezzare un file e metterne le righe in un array devi procedere manualmente. Non mi risulta esista un metodo che da un file produce un vettore di stringhe, anche se farlo sarebbe abbastanza banale, no?

    Come diceva andbin per te potrebbe essere più conveniente usare un Set, oppure una HashMap o un ArrayList.
    Queste sono strutture già pronte e non hanno una dimensione fissa come i vettori.
    Se la cosa per te ha rilevanza, con Set o una HashMap i tempi di ricerca sono molto migliori che con un array, a patto che il numero dei dati sia sufficientemente elevato.

    Ma i tuoi dati sono numeri o stringhe?
    E quante righe può avere il file? Se conosci il limite massimo puoi tranquillamente usare un vettore.
    "Ethics are to me something private. Whenever you use it as an argument for why somebody_else should do something, you’re no longer being ethical, you’re just being a sanctimonious dick-head"
    Linus Torvalds

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    4
    Sono stringhe.. li ho riportato una esempio, ma sono stringhe che cominciano con numeri:
    tipo

    4 "QUALCOSA"
    5 "QUALCOSA"
    4 "QUALCOSA"
    3 "QUALCOSA"
    1 "QUALCOSA"

    il numero come prefisso di ogni riga separato dal resto con uno spazio (se pero ci sono 2 numeri uguali ovviamente prevale il numero più in alto) "tecnicamente" è limitato alla portata di INT, fino a 2.147.483.364, non penso che uno abbia la pazienza di metterne cosi tanti però ecco ideologicamente la portata è quella, l' ordine non mi interessa.

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.