Saltare prima riga in una lettura da file

di il
7 risposte

Saltare prima riga in una lettura da file

Ciao a tutti ragazzi!
L'esame si avvicina
Ho un piccolo problemino e non riesco a capire dove sbaglio.

Sto leggendo un file di testo così composto:
8
barcellona,1,
realmadrid,1,
arsenal,2,
liverpool,2,
chelsea,1,
porto,2,
bayern,2,
manchester,1,

L'esercizio mi chiede di leggere il primo numero / farne un po' quel che mi pare.
(vuole vedere se siamo in grado di scartarlo e passare alla lettura reale)

FInchè tolgo temporaneamente quell'8 dal file non da problemi e fa tutto quello che gli chiedo.
Appena lo inserisco eclipse si blocca

Ho provato con uno scanner a risolvere come potete vedere ma nulla.
Ignorate la seconda parte che è da ultimare e non ci interessa per ora

Help me
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.StringTokenizer;

public class SorteggioSquadre {
	private static final String String = null;

	public static void main(String[]args) throws FileNotFoundException {
		ArrayList <Squadra>listaSquadre=new ArrayList<Squadra>();

		try{
			FileReader fr=new FileReader("insiemesquadre.txt");
			BufferedReader br=new BufferedReader(fr);
			String rigaLetta =br.readLine();

			//*********************Devo fargli saltare il primo numero scritto nella prima riga del file di testo****************
			Scanner s=new Scanner(System.in);
			int saltaIlNumeroInRiga1=s.nextInt();
			System.out.println(saltaIlNumeroInRiga1);

			while(rigaLetta!=null){
				// uso lo StringTokenizer per scorrere il file suddiviso dai pipe
				StringTokenizer st = new StringTokenizer( rigaLetta, "," );
				String Nome = st.nextToken();
				String Numero = st.nextToken();

				try
				{
					Squadra frTemp = new Squadra( Nome, Numero);
					listaSquadre.add(frTemp);
				}

				catch( NumberFormatException nfe )
				{
					System.out.println( "Errore DA DECIFRARE NEL CODICE: " + rigaLetta + "; record" );
				}

				// legge la linea 
				rigaLetta = br.readLine( );
			}

			// chiude il flusso con "insiemeSquadre.dat"
			br.close( );
		}

		catch( FileNotFoundException fnfe )
		{
			System.out.println( "ERRORE:File .txt non trovato" );
		}

		catch( IOException ioe )
		{
			ioe.printStackTrace( );
		}
////////////SECONDA PARTE/////////////
		
		//****** stampa i prodotti letti 
		for ( Squadra elementi: listaSquadre ){
			//con un if stampa una selezione degli elementi
			//per esempio
			//	if (elementi.Numero.equalsIgnoreCase("n"))
			System.out.println(elementi.Nome +" "+  elementi.Numero); 
		}
		System.out.println("******************");
		for(int i=0;i<listaSquadre.size();i++)
			System.out.println(listaSquadre.get(i));

		//		metto le squadre con numero 1 in un arraylist
		ArrayList <Squadra>numeri1=new ArrayList<Squadra>();

		for ( Squadra elementi: listaSquadre )
			if (elementi.Numero.equalsIgnoreCase("1"))
				numeri1.add(elementi);

		//numeri 2

		ArrayList <Squadra>numeri2=new ArrayList<Squadra>();

		for ( Squadra elementi: listaSquadre )
			if (elementi.Numero.equalsIgnoreCase("2"))
				numeri2.add(elementi);


		System.out.println("******************");
		for(int i=0;i<numeri2.size();i++)
			System.out.println(numeri2.get(i));


	}
}

7 Risposte

  • Re: Saltare prima riga in una lettura da file

    cicciozza ha scritto:


    L'esercizio mi chiede di leggere il primo numero / farne un po' quel che mi pare.
    Deduco che quel numero indichi quanti "record" di informazione seguono nelle righe successive. Quindi non è che ci puoi fare "quel che ti pare" .... servirebbe proprio come controllo della correttezza del file.
    Pertanto leggi il numero e poi fai un ciclo for per fare esattamente quelle N letture di record. Se ad un certo punto readLine ti dà null vuol dire che il file è "malformato" ovvero il numero di record effettivi non è coerente con il numero iniziale. Questo è un errore di formato che dovresti gestire.

    Quindi: leggi la prima riga con readLine(), fai il parsing del numero in stringa con Integer.parseInt e poi usi il numero appunto per pilotare il numero di letture che ci si aspetta di poter fare.
  • Re: Saltare prima riga in una lettura da file

    Hai reso l'idea, farò il ciclo for, però:
    Il primo numero come lo leggo?
    Tieni presente che questa è la mia domanda.

    Con uno scanner mi va in loop
    e con il BufferedReader mi incasino la vita
  • Re: Saltare prima riga in una lettura da file

    cicciozza ha scritto:


    Hai reso l'idea, farò il ciclo for, però:
    Il primo numero come lo leggo?
    Tieni presente che questa è la mia domanda.
    L'ho detto prima: readLine() di BufferedReader. Poi per ottenere un int, puoi usare Integer.parseInt. In alternativa uno Scanner solo per questa riga e poi nextInt(). Ma è più lungo.

    cicciozza ha scritto:


    e con il BufferedReader mi incasino la vita
    BufferedReader È appropriato per leggere quel file.
  • Re: Saltare prima riga in una lettura da file

    E' andata!!
    GRAZIE andbin!!!
    posto il codice che magari a qualche disperato come me può servire

    SQUADRA
    
    public class Squadra {
    
    	String Nome;
    	String Numero;
    	
    	public  Squadra(String nom, String numer){
    		this.Nome=nom;
    		this.Numero=numer;
    	
    	}
    
    	public String getNome() {
    		return Nome;
    	}
    
    	public void setNome(String nome) {
    		Nome = nome;
    	}
    
    	public String getNumero() {
    		return Numero;
    	}
    
    	
    
    	public void setNumero(String numero) {
    		Numero = numero;
    	}
    	public void visualizzaSquadra() {
    	    System.out.println("*****************************");
    	    System.out.println("Nome: "+Nome);
    	    System.out.println("Cognome: "+Numero);
    	}
    @Override
    	public String toString() {
    		return "Squadra [Nome=" + Nome + ", Numero=" + Numero + "]";
    	}
    }
    


    Main:
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.Scanner;
    import java.util.StringTokenizer;
    
    public class SorteggioSquadre {
    	private static final String String = null;
    
    	public static void main(String[]args) throws FileNotFoundException {
    		ArrayList <Squadra>listaSquadre=new ArrayList<Squadra>();
    		String primaRiga;
    
    		try{
    			FileReader fr=new FileReader("insiemesquadre.txt");
    			BufferedReader br=new BufferedReader(fr);
    			primaRiga=br.readLine();
    			String rigaLetta =br.readLine();
    
    			Scanner s=new Scanner(System.in);
    			int primoNumero=Integer.parseInt(primaRiga);;
    
    			for(int z=0;z<primoNumero;z++){
    				while(rigaLetta!=null){
    					// uso lo StringTokenizer per scorrere il file suddiviso dai pipe
    					StringTokenizer st = new StringTokenizer( rigaLetta, "," );
    					String Nome = st.nextToken();
    					String Numero = st.nextToken();
    
    					try
    					{
    						Squadra frTemp = new Squadra( Nome, Numero);
    						listaSquadre.add(frTemp);
    					}
    
    					catch( NumberFormatException nfe )
    					{
    						System.out.println( "Errore DA DECIFRARE NEL CODICE: " + rigaLetta + "; record" );
    					}
    
    					// legge la linea 
    					rigaLetta = br.readLine( );
    				}
    
    				// chiude il flusso con "insiemeSquadre.dat"
    				br.close( );
    			}
    
    		}
    		catch( FileNotFoundException fnfe )
    		{
    			System.out.println( "ERRORE:File .txt non trovato" );
    		}
    
    		catch( IOException ioe )
    		{
    			ioe.printStackTrace( );
    		}
    		////////////SECONDA PARTE/////////////
    
    		//****** stampa i prodotti letti 
    		for ( Squadra elementi: listaSquadre ){
    			//con un if stampa una selezione degli elementi
    			//per esempio
    			//	if (elementi.Numero.equalsIgnoreCase("n"))
    			System.out.println(elementi.Nome +" "+  elementi.Numero); 
    		}
    		System.out.println("******************");
    		for(int i=0;i<listaSquadre.size();i++)
    			System.out.println(listaSquadre.get(i));
    
    		//		metto le squadre con numero 1 in un arraylist
    		ArrayList <Squadra>numeri1=new ArrayList<Squadra>();
    
    		for ( Squadra elementi: listaSquadre )
    			if (elementi.Numero.equalsIgnoreCase("1"))
    				numeri1.add(elementi);
    
    		//numeri 2
    
    		ArrayList <Squadra>numeri2=new ArrayList<Squadra>();
    
    		for ( Squadra elementi: listaSquadre )
    			if (elementi.Numero.equalsIgnoreCase("2"))
    				numeri2.add(elementi);
    
    
    		System.out.println("******************");
    		for(int i=0;i<numeri2.size();i++)
    			System.out.println(numeri2.get(i));
    
    
    	}
    }
    
    
  • Re: Saltare prima riga in una lettura da file

    cicciozza ha scritto:


    
    public class Squadra {
    
    	String Nome;
    	String Numero;
    	
    	public  Squadra(String nom, String numer){
    		this.Nome=nom;
    		this.Numero=numer;
    	
    	}
    
    In casi di classi "bean" come queste, tieni sempre le variabili di istanza come private, a meno che ci siano altre necessità che devono essere ben IMPORTANTI e precise.

    Inoltre cerca di seguire almeno un minimo delle convenzioni standard. Nomi di variabili che iniziano con la minuscola. E per i parametri si usa tipicamente lo stesso nome dei campi, usando this per qualificare il campo.

    cicciozza ha scritto:


    Main:
    			for(int z=0;z<primoNumero;z++){
    				while(rigaLetta!=null){
    
    No, questo ha abbastanza poco senso

    Questo invece ha più senso.
    BufferedReader br = new BufferedReader(fr);
    
    String primaRiga = br.readLine();
    int numeroRecord = Integer.parseInt(primaRiga);
    
    for (int i = 0; i < numeroRecord; i++) {
        String lineaRecord = br.readLine();
    
        if (lineaRecord != null) {
            // elabora linea
        } else {
            // qui è un errore in quanto mancano record
        }
    }
    Inoltre tutta la lettura del file sarebbe stato meglio almeno farla in un metodo separato in SorteggioSquadre.
  • Re: Saltare prima riga in una lettura da file

    Della serie " non si finisce mai di imparare"

    Ho appena finito, stasera dovrei avere il tempo per farne una copia con i suggerimenti che mi hai dato.

    Solo una cosa, non ho capito come potevo migliorare la lettura del file (ultima frase)
    Un'altra: se in questo momento imposto la visibilità di Squadra a Private poi cosa devo andare a cambiare nel main?

    Se mi dici dove abiti ti mando un mazzo di rose
  • Re: Saltare prima riga in una lettura da file

    cicciozza ha scritto:


    Solo una cosa, non ho capito come potevo migliorare la lettura del file (ultima frase)
    Intendevo dire che invece di fare tutto nel main(), potevi almeno spostare la lettura del file in un metodo a parte, anche lì nella stessa classe:

    private static List<Squadra> leggiFileSquadre(String filename) throws IOException

    E poi usarlo nel main.

    cicciozza ha scritto:


    Un'altra: se in questo momento imposto la visibilità di Squadra a Private poi cosa devo andare a cambiare nel main?
    Non il livello di accesso della classe Squadra in sé ma delle sue variabili di istanza:

    String Nome;
    String Numero;

    che dovrebbero stare private per il "buon principio di incapsulamento". Se li metti private poi chiaramente NON potrai fare es. elementi.Nome ma dovrai usare il getNome().

    cicciozza ha scritto:


    Se mi dici dove abiti ti mando un mazzo di rose
    Ma no no.
Devi accedere o registrarti per scrivere nel forum
7 risposte