Newsgroup: it.comp.java
Titolo: parser txt

Ciao a tutti,
ho la necessità di parsare in file di testo.
C'è qualche libreria in particolare che potrei usare?
Oppure qualche consiglio su come realizzarlo con le api standard?
Grazie
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

Questo esempio legge uno riga alla volta da un file di testo chiamato
"example.txt"
import java.io.*;
public class LeggiFile
{
	public static void main (String[] args) {
	String str;
	try {
		BufferedReader br = new BufferedReader(new
FileReader("example.txt"));
		while ((str = br.readLine()) != null) System.out.println(str);
            br.close();
	}
	catch (IOException ioe) { System.out.println(ioe); }
	}
}
Poi bisogna vedere come è formattato il tuo file testo.
Se puoi passa subito a lavorare con il parsing di file Xml.
Ciao

 C'è qualche libreria in particolare che potrei usare?
Dipende dal formato del file di testo.
Quanto è complicato il formato di testo?
Se il formato è semplice potresti trovare utile la classe Scanner, che 
fa il parsing di numeri interi, e reali e delle stringhe.
Poi se serve la libreria standard comprende anche le espresioni regolari.
Se il formato è abbastanza complesso potrebbe essere utile considerare 
un parser generator come antlr.
Se è un file xml conviene usare le librerie per gli xml.
Se vuoi una risposta utile spiega qual'é il formato del file di testo.
Probabilmente il modo piu' immediato per farlo è mandare un file di esempio.
-- 
Andrea Francia
http://andreafrancia.blogspot.com/2008/06/relazioni-molti-molti-con-jpa.html

Naturalmente, se le info che si trovano nel file di testo sono
piuttoste "statiche".. anzi lo sono proprio nel senso che non cambiano
mai, sono dei dati storici - riferiti al passato, allora tanto vale
inserirle direttamente nel main della tua applicazione (non so quale
sia il termine più tecnico per descrivere questa operazione) anzichè
parsarle ogni volta dall'esterno.
A mio parere l'uso di database (come fogli di testo, xml o roba varia
tipo mysql, oracle, postgre, ...) sono utili solo quando le
informazioni utili alla nostra applicazione hanno un elevato tasso di
variabilità.. cambiano continuamente il loro valore.

 Grazie
Oltre a quanto ti hanno proposto, valuta se ti conviene usare un oggetto 
Properties, che ha un parser testuale ed xml integrato e valori 
predefiniti..... 

 variabilità.. cambiano continuamente il loro valore.
Quindi 10000 record storici (quindi immutabili), tu li mettersti
dentro il main?
@Calypso Kid: dicci il formato del file (se ne ha uno) se no non
possiamo aiutarti, ovviamente.

ehm.. qual'è il problema di tenere 10000 record nel main (se e solo se
tutti e 10mila sono utili alla elaborazione!!)

 tutti e 10mila sono utili alla elaborazione!!)
In effetti in molti programmi alcuni dati statici sono contenuti dentro 
le inizializzazioni di array.
Il vantaggio è che il programma non deve leggere un file esterno e 
quindi non possono capitare tutti i problemi di IOException.
Uno svantaggio è che il codice oggetto (il .class per il Java) potrebbe 
diventare grande.
Un altro svantaggio potrebbe essere che la rappresentazione potrebbe non 
essere la più comoda per esprimere i dati.
Dato che sono tanti invece di metterli dentro la funzione main() 
potrebbe essere meglio metterli dentro un file sorgente a parte.
Ciao

Non ho capito questa parte, me la puoi rispiegare meglio :-) ?
      > Un altro svantaggio potrebbe essere che la rappresentazione
potrebbe non
      > essere la più comoda per esprimere i dati.
non capisco bene.. io quando scrivo un programma, il suo main, creo/
studio il miglior modo per rappresentazione i dati e creo/studio il
modo più comodo per gestirli/elaborarli.. Ti riferivi anche Tu a
questo concetto ?
e poi, quando dici
      > Dato che sono tanti invece di metterli dentro la funzione
main()
      > potrebbe essere meglio metterli dentro un file sorgente a
parte.
intendi dire che nel corpo del programma, nel main(),
mi ritrovo una classe
      CaricaDatiStorici cds = CaricaDatiStorici();
      cds.elaboraDatiStorici();
quindi tutti i dati sono scritti uno a uno, posti dentro una
struttura, nel file sorgente CaricaDatiStorici.java ??
Se intendi questo sono molto d'accordo con Te.
Non metterei mai 10000 records nudoi&crudi nel main, troppa
confusione..
.. li reghelerei, appunto, in una loro classe da importare/
inizializzare nel nostro main()
Ciao

 questo concetto ?
Alcune rappresentazioni sono piu' comode di altre.
Se hai dati rappresentati come definizione di un array nel codice 
sorgente allora i dati li puoi usare solo nel tuo programma.
Se hai i dati rappresentati in un'altro formato, per esempio un file 
CSV, alla bisogna puoi manipolarli in modo piu' semplice.
Per esempio un giorno di accorgi che sarebbe meglio memorizzare i dati 
in ordine alfabetico.
Se avessi i dati storici in formato CSV potresti aprirlo con Excel e 
ordinare i dati molto facilmente. Invece nel caso di una definizione di 
un array nel codice sorgente sarebbe piu' complicato.
Un'altro esempio è quando vuoi aggiungere una colonna in mezzo ad altre 
due.
Non sto dicendo che i file CSV sono meglio che mettere i dati nel 
sorgente. Sto dicendo che oltre ai vantaggi bisogna anche valutare anche 
gli svantaggi di questa soluzione.
La stessa cosa vale se i dati devi usarli al di fuori del tuo programma.
Metti per esempio che devi scrivere un documento di disegno di dettaglio 
e che ad un certo punto vuoi riportare una tabella con scritto i dati 
usati dal tuo programma.  Se hai il file CSV ti basta fare un copia e 
incolla da Excel a Word.  Se hai i dati dentro il codice sorgente devi 
rimaneggiarli un po' prima di ottenere una tabella.



Stai scherzando vero? Se ho 10 mila record neppure mi sogno di
metterli dentro un sorgente Java. Non c'e' alcun pro e contro, c'e'
solo il contro.
-Eclipse si pianta
- scrivere e mantenere un array e' molto piu' tedioso di un CSV ad
esempio.
In sostanza non e' lo strumento adatto.
Se lo metti nel classpath e usi getResourceAsStream come fanno tutti
per leggerlo non avrai mai alcun IOException ecc.

 per leggerlo non avrai mai alcun IOException ecc.
A no? Se manca il file? Se non viene incluso nel .jar per errore?
Se per qualche motivo il file non č leggibile?
Il fatto č queste cose le puoi verificare solo a runtime, la presenza 
dell'array la scopri a compile time.
E poi sia che l'evento dell'IOException č probabile o meno si tratta di 
un'eccezione checked, da controllare comunque. Cosa fai? gli metti un 
catch vuoto?
Se sei in un ambiente dove le risorse sono scarse (e.g. embedded), uno 
dovrebbe considerare il costo di fare dell'I/O.
Comunque non sto dicendo che la cosa giusta da fare č usare sempre 
l'array, sto solo ridimensionando i tuoi "contro".
-- 
Andrea Francia
http://www.andreafrancia.it/

 l'array, sto solo ridimensionando i tuoi "contro".
Puoi anche sbilanciarti qualche volta...e dire che nella stragrande
maggioranza dei casi scrivere un array di quel tipo è sbagliato.

 maggioranza dei casi scrivere un array di quel tipo è sbagliato.
Sbilanciati tu se ti va.


 Lo scopri a compile time.
E se ti dimentichi una riga (cosa molto piu' probabile)?


E se ti dimentichi una riga nel file?
Non è uguale?


 sia giusta?
Se sai già che le opinioni degli altri sono sbagliate e solo le tue sono 
giuste perché perdi tempo ad ascoltare chi la pensa diversamente?



Bravo, l'hai detto finalmente.

On 1 Lug, 14:50, Andrea Francia

E dove sta scritto che non le ho ascoltate?
Ho letto e valutato un'opinione diversa dalla mia. Dopo la riflessione
non ho cambiato idea e quindi non puo' essere altro che sbagliata.
Oppure vuoi obbligarmi ad iniziare tutte le frasi con un ridondante
"secondo me"?
Fallo tu se hai voglia...


Ho detto che è uguale solo per questa cosa.
Non manipolare le cose che dico per piacere.


 non ho cambiato idea e quindi non puo' essere altro che sbagliata.
Ci rinuncio.


 ritorna null ma non lancia alcuna IOException)
Le IOException le lanciano i metodi dell'InputStream che ti ha 
restituito getResourceAsStream().


 CSV?
Ma perché devi scrivelo a mano l'array?
Con un po' di esperienza puoi generare il codice partendo da uno 
spreadsheet con Excel o da un .CSV con awk.
