Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    Lettura di un file con caratteri speciali

    Salve a tutti, devo leggere un file di questo tipo:
    <Casa>
    500,...,....;
    <Barca>
    ....,....,500;

    A me interessano solamente i dati relativi alle case, pertanto imposto la mia readile prendendo solamente i valori che NON terminano con zero e che non termino con ">"

    while((line = br.readLine()) != null){ if (! line.endsWith("0")) {
    if (!line.contains("<")) {
    if (!line.endsWith("R")) {
    System.out.println(line);
    }
    }
    }
    }

    Tuttavia, al momento della stampa mi accorgo che le mie righe sotto <casa> vengono mantenute nonostante terminino con zero. è come se il carattere "<" inserisse nella lettura anche la riga successiva.
    è così o sono io che ho sbagliato l'impostazione??

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Dall'esempio che hai postato però, sembra che le righe senza i tag <,> , quelle cioè contenenti i valori di interesse, terminino sempre con il carattere ";" , quindi ad esempio quel "....,....,500;", per come hai scritto il codice, è giusto che venga stampato a video ...

    Se sto sbagliando io potresti provare a postare un esempio completo con una decina di righe complete del tuo file, e il relativo output che ottieni con il tuo codice (completo se fai qualche altra operazione) ...

  3. #3
    <Casa>
    Villetta,centro,20000
    Appartamento,Periferia,10000
    </Casa>
    <Barca>
    5000,Honda,Motoscato
    8000,Suzuki,Piroscafo
    5000,Honda,Gommone
    <Casa>
    Maisonette, centro, 30000
    Loft, centro, 50000

    Allora io metto come condizioni:
    (! line.endsWith("0")) && (!line.contains("<")
    Tuttavia la mia stampa risulta essere:

    Villetta,centro,20000
    5000,Honda,Motoscato

    8000,Suzuki,Piroscafo
    5000,Honda,GommoneMaisonette, centro, 30000

    Come puoi vedere i tre elementi centrali sono corretti, ma i primi due risultano essere quelli immediatamente successivi alle line con <>.


  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Martina! Visualizza il messaggio
    Salve a tutti, devo leggere un file di questo tipo:
    <Casa>
    500,...,....;
    <Barca>
    ....,....,500;

    A me interessano solamente i dati relativi alle case
    I <Casa> e <Barca> sono delle righe di "intestazione" che indicano l'inizio di N (1, 2, 3 ecc...) righe per quella tipologia .... o è una intestazione per ciascuna singola riga? Bisognerebbe vedere un esempio più lungo.
    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 L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Martina! Visualizza il messaggio
    <Casa>
    Villetta,centro,20000
    Appartamento,Periferia,10000
    </Casa>
    <Barca>
    5000,Honda,Motoscato
    8000,Suzuki,Piroscafo
    5000,Honda,Gommone
    <Casa>
    Maisonette, centro, 30000
    Loft, centro, 50000
    Ma questo pone ulteriori domande: perché il primo blocco è racchiuso tra le righe <Casa> e </Casa> ma poi c'è di seguito un <Barca> (che non è seguito da un ipotetico </Barca>) e poi successivamente un <Casa> ??
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Scusami, ho commesso un errore io<Casa>
    Villetta,centro,20000
    Appartamento,Periferia,10000
    </Casa>
    <Barca>
    5000,Honda,Motoscato
    8000,Suzuki,Piroscafo
    5000,Honda,Gommone
    </Barca>
    <Casa>
    Maisonette, centro, 30000
    Loft, centro, 50000
    </Casa>

    Come vedi i virgolettati introducono blocchi contenenti elementi della stessa tipologia, i blocchi sono di grandezza differente e contengono dati differenti e in ordine differente. In particolare, io sono interessata al prezzo, e si trova alla fine nel caso delle Case e all'inizio del caso delle Barche.



  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Martina! Visualizza il messaggio
    Come vedi i virgolettati introducono blocchi contenenti elementi della stessa tipologia, i blocchi sono di grandezza differente e contengono dati differenti e in ordine differente. In particolare, io sono interessata al prezzo, e si trova alla fine nel caso delle Case e all'inizio del caso delle Barche.
    Ok, ora è chiaro. I blocchi di ciascuna informazione (barche o case) sono ben delimitati da una "marcatore" di inizio <XXX> e un marcatore di fine </XXX>.

    In questo caso se vuoi estrarre solo dai blocchi Casa, devi mantenere uno "stato". Banalmente una variabile booleana che ti dice se sei all'interno di un blocco Casa oppure no.

    Quindi: se la riga (magari trimmata dagli spazi iniziali/finali) è esattamente <Casa> allora metti un flag es. inCasa = true. Le seguenti righe le considererai sulla condizione che inCasa sia appunto a true.
    Quando trovi la riga </Casa> metti il flag inCasa a false. Quindi tutti i blocchi delle barche verranno pertanto saltati.
    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
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Comunque, giusto per sport, ho provato a copiare/incollare il tuo codice iniziale, aggiungendo il minimo necessario a farlo "andare", e mi sono copiato in prova.txt il tuo esempio di file :

    <Casa>
    Villetta,centro,20000
    Appartamento,Periferia,10000
    </Casa>
    <Barca>
    5000,Honda,Motoscato
    8000,Suzuki,Piroscafo
    5000,Honda,Gommone
    </Barca>
    <Casa>
    Maisonette, centro, 30000
    Loft, centro, 50000
    </Casa>

    Con questo codice :

    codice:
    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.IOException;
    public class Test
    {
    	public static void main(String[] a) throws IOException{
    		BufferedReader br = new BufferedReader(new FileReader("prova.txt"));
    		String line = "";
    		while((line = br.readLine()) != null){ 
    			if (! line.endsWith("0")) {
    				if (!line.contains("<")) {
    					if (!line.endsWith("R")) {
    						System.out.println(line);
    					}
    				}
    			} 
    		}
    	}
    }
    L'ouput ottenuto è il seguente :

    C:\Users\...>java Test
    5000,Honda,Motoscato
    8000,Suzuki,Piroscafo
    5000,Honda,Gommone


    C:\Users\...>


    Quindi io non riscontro il problema di cui tu parli con questo codice ...

  9. #9
    Quote Originariamente inviata da andbin Visualizza il messaggio

    Quindi: se la riga (magari trimmata dagli spazi iniziali/finali) è esattamente <Casa> allora metti un flag es. inCasa = true. Le seguenti righe le considererai sulla condizione che inCasa sia appunto a true.
    Quando trovi la riga </Casa> metti il flag inCasa a false. Quindi tutti i blocchi delle barche verranno pertanto saltati.
    Tuttavia i miei elementi si trovano su righe diverse: devo pertanto mettere un for che mi indica il flag inCasa true se la riga = <Casa> en mantiene questo flag a true fino a quando non trova </Casa>.

    Giusto?

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Martina! Visualizza il messaggio
    Tuttavia i miei elementi si trovano su righe diverse: devo pertanto mettere un for che mi indica il flag inCasa true se la riga = <Casa> en mantiene questo flag a true fino a quando non trova </Casa>.

    Giusto?
    No, il for non servirebbe (se non devi fare qualcosa di molto specifico che potrei non sapere io). Grosso modo:

    codice:
    String linea;
    boolean inCasa = false;
    
    while ((linea = bufReader.readLine()) != null) {
        if (linea.equals("<Casa>")) {
            inCasa = true;
        } else if (linea.equals("</Casa>")) {
            inCasa = false;
        } else {
            // qui qualunque altra riga
    
            if (inCasa) {
                // qui per ciascuna riga tra <Casa> e </Casa>
                // analizza la riga della casa (spezza la riga, estrai i dati, ecc...)
            }
        }
    }
    Ultima modifica di andbin; 07-09-2016 a 10:28
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Tag per questa discussione

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.