Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 38
  1. #1

    Come leggere da file diverse linee di numeri anche se ci sono caratteri

    Salve a tutti,
    sono una neofita di java (ho sempre fatto programmazione strutturata e ho cominciato a studiare java da un mese circa) però, poichè mi serve per la tesi, devo imparare a leggere da file una serie di informazioni per poi poterle elaborare e riscrivere su un altro file. Il mio problema è il seguente: dispongo di un'infinità di file .gz, tutti con la stessa struttura, contenenti dei valori che voglio estrarre e salvare. Tuttavia i dati non risultano essere disposti tutti allo stesso modo... Ora cerco di spiegare il problema:

    Sulla prima riga compaiono solo 3 numeri uno di seguito l'altro seguiti da 3 parole (che in pratica mi dicono cosa sono questi 3 numeri) separate da virgola. In questa riga lo spazio tra questi dati non è sempre uguale. Questi 3 numeri li devo salvare in 3 variabili diverse tra loro.

    Nella seconda riga, dopo un paio di spazi, ho un numero da leggere (supponiamo 99) che mi dice quanti sono i valori successivi da memorizzare e dopo qualche spazio ho 4 stringhe che non voglio leggere.

    Dalla terza riga in poi compaiono i valori che mi interessano divisi in tre categorie che si susseguono (cioè se ho 99 valori avrò 33 valori categoria a, 33 valori cat b e 33 cat c). Sono uno di seguito l'altro separati da uno spazio e la categoria a è disposta su 4 colonne mentre la b e la c su 6. Questi numeri li devo salvare in 3 vettori diversi (in questo esempio di 33 posti ciascuno) perchè sono 3 cose diverse. In sintesi ho (i miei commenti alla riga li metto dopo //)

    111 222 333 nome1, nome2, nome3
    444 nome 4
    555 555 555 555
    555 555 555 555
    ...
    555 555 // la riga qui finisce cosi e finisce anche la categoria1
    666 666 666 666 666 666
    666 666 666 666 666 666
    ...
    666 666 666 777 777 777 // il punto in cui cambia cat non è chiaro perchè sono numeri simili
    777 777 777 777 777 777
    ...
    777 777

    Alla fine dovrò avere: var1=111, var2=222, var3=333, numero_punti=444

    vet[444]=555, vet[444]=666, vet[444]=777

    Ho supposto che si potesse applicare uno string tokenizer alle prime due rige convertendo i numeri in numeri (alcuni sono interi, double e tutti gli altri float) e tralasciando le stringhe, e una volta conosciuto il numero di punti fare 3 cicli for in cui, sempre usando il tokenizer potessi salvarmi questi 3 vettori. In linea teorica credo sia questo che si deve fare, ma praticamente non so come metterci mano!!!In più al momento non mi funziona neppure il neatbeans sotto windows (non mi fornisce output)!!! Avevo letto dell'istruzione arraylist, ma potrebbe essere utile nel mio caso? Se si come? Il più grosso problema è cercare di capire dove finisce ogni categoria di dati perchè il numero di punti è grandissimo (circa 50000), ma non è lo stesso tra file e file.

    Ogni consiglio e/o aiuto è ben accetto!!!

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    724
    in questo post fa +/- quello che ti serve lettura da file e caricamento su array.
    http://forum.html.it/forum/showthrea...hreadid=995296

  3. #3
    Originariamente inviato da perzem
    in questo post fa +/- quello che ti serve lettura da file e caricamento su array.
    http://forum.html.it/forum/showthrea...hreadid=995296

    L'ho guardato, ma quello che chiedo di fare io non è proprio la stessa cosa! Infatti in quel caso potevo leggere ad una le righe e aggiungerle ad un array una volta tolta la prima colonna.
    Qui invece le colonne cambiano dopo non so quante righe, e devo usare tre array diversi anzichè uno solo. So solo (dal terzo numero) la dimensione dei tre array. Probabilmente se fossi già in grado di programmare bene in Java avrei saputo tradurre i tuoi consigli per risolvere il mio problema, ma a me sembra una missione impossibile! Per essere più chiara riporto un pezzo del file:

    10000 3.50000 0.00000 Teff, logg, [M/H]
    52790 number of wavelength points
    1.000000000000000e+01 1.200000000000000e+01 1.400000000000000e+01 1.600000000000000e+01 // qui va a capo
    1.800000000000000e+01 2.000000000000000e+01 2.200000000000000e+01 2.400000000000000e+01// va a capo
    ....
    4.994000000000000e+05 4.995000000000000e+05 4.996000000000000e+05 4.997000000000000e+05// va a capo
    4.998000000000000e+05 4.999000000000000e+05// fine prima categoria
    0.00000e+00 0.00000e+00 0.00000e+00 0.00000e+00 0.00000e+00 0.00000e+00//2a categ
    0.00000e+00 0.00000e+00 0.00000e+00 0.00000e+00 0.00000e+00 0.00000e+00
    ....
    3.17084e+08 3.16792e+08 3.16573e+08 3.16282e+08 3.16063e+08 3.15773e+08
    3.15554e+08 3.15337e+08 //fine seconda cat
    0.00000e+00 0.00000e+00 0.00000e+00 0.00000e+00 0.00000e+00 0.00000e+00//3a categ
    0.00000e+00 0.00000e+00 0.00000e+00 0.00000e+00 0.00000e+00 0.00000e+00
    0.00000e+00 0.00000e+00 0.00000e+00 0.00000e+00 0.00000e+00 0.00000e+00
    ....
    4.12778e+08 4.12494e+08 4.12113e+08 4.11829e+08 4.11450e+08 4.11166e+08
    4.10787e+08 4.10504e+08 // fine categ e fine file

  4. #4
    Non ho capito bene cosa siano quei dati nei file ma se vuoi ti posso fornire
    delle classi che ho realizzato che utilizzano la tecnologia nio.
    Queste classi semplificano la lettura e la scrittura da e su file
    utilizzando i buffer e i canali ma con un codice piu' pulito e diretto.
    Ora non so come i dati siano salvati nei file .gz, ovvero se sono
    tutti caratteri quanti byte e' un carattere? se contiene dati grezzi
    senza alcuna conversione che dati sono?? int, double, long etc etc.
    Con la tecnologia nio leggi e scrivi byte in maniera piu' palese.
    ciao
    Nulla, ma e' sempre qualcosa.

  5. #5
    Dimenticavo la tecnologia nio puoi usare i buffer supporati da un array come mezzo
    di memoria e quindi l'array viene direttamente letto o scritto in funzione di cio'
    che devi fare con il file.
    Nulla, ma e' sempre qualcosa.

  6. #6
    Originariamente inviato da maurizio2
    Non ho capito bene cosa siano quei dati nei file
    Sono dei dati riguardanti una stella. I primi 3 numeri sono la temp, il log della gravità, il contenuto di metalli. Nella seconda riga compare il numero di punti successivi, dalla terza in poi, di seguito, la lunghezza d'onda, il flusso e la funzione di plank. per questo ho bisogno di 3 array, sono tutte cose diverse!

    Per quanto riguarda la conversione byte-carattere, io stessa ho ancora un pò di confusione a riguardo, posso al max provare ad allegarlo, ma è lunghissimo e non so se avrebbe senso farlo.

    Come diceva Perzem il problema è similie a quello del link da lui datomi, ma qui non si ha un numero costante di colonne tra i vari casi e a priori il numero di righe è diverso. Non so davvero come uscirne fuori! Avessi avuto qualche nozione in più di java avrei sicuramente avuto meno problemi, ma purtroppo ho dovuto cominciare la mia conoscenza di java prorpio dalla "lettura da file", che a differenza di altri linguaggi mi sembra piuttosto complicata!!!

  7. #7
    Ti ho mandato in privato l'indirizzo della mia posta mandami un file cosi' capisco cosa
    contiene ciao
    Nulla, ma e' sempre qualcosa.

  8. #8
    Originariamente inviato da maurizio2
    Ti ho mandato in privato l'indirizzo della mia posta mandami un file cosi' capisco cosa
    contiene ciao
    Già fatto! Grazie

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    724
    andiamo per passi...
    -per memorizzare la prima linea nn ci sono problemi, una volta letta dal file la tokenizziamo e se sappiamo che i valori sono sempre nello stesso ordine li mettiamo nelle proprie variabili.
    -tokenizziamo anche la seconda linea e memorizziamo il valore in una variabile intera...
    - terza riga:d ichiariamo 3 array e un contatore. dal file che hai postato sembra che ogni categoria inizia su una nuova riga quindi se il numero di el è sempre divisibile per 3 usiamo un contatore incrementandolo finchè nn arriviamo alla soglia e poi cambiamo array



    codice:
    FileReader reader=new FileReader(fileName);
    BufferedReader br = new BufferedReader(reader); 
    String line = null;
    int cont=0;
    int v1,v2,v4;
    int nn;
    while ((line = br.readLine()) != null) {//continua a leggere dal file finche nn legge vuoto
    	StringTokenizer st = new StringTokenizer(line);
    while(st.hasMoreTokens()){
    //salviamo le prime 3 var
    	if (cont==0){v1=st.nextToken();
                                   cont++}else {if (cont==1){v2=st.nextToken();cont++;}else{v3==st.nextToken();cont++;}}
    if (cont==4)   {nn=st.nextToken();cont++;}//salviamo il numero della seconda riga
    if(cont>4){copiamo nei vari array}
    } }
    ho buttato questo codice al volo nn l'ho testato, però potrebbe essere un inizio

  10. #10
    Originariamente inviato da perzem
    - terza riga:dichiariamo 3 array e un contatore. Dal file che hai postato sembra che ogni categoria inizia su una nuova riga quindi se il numero di el è sempre divisibile per 3 usiamo un contatore incrementandolo finchè nn arriviamo alla soglia e poi cambiamo array
    Grazie per la tua gentilezza.

    Purtroppo il numero di elementi non è sempre uguale quindi non è detto che sia sempre divisibile per tre! Qui sta il bello! Fosse stato sempre lo stesso la distribuzione nelle righe sarebbe stata sempre uguale e i tre array di dimensione identica per tutti i file. Invece l'indice che tu hai chiamato nn varia sempre!
    Un'altra cosa... poichè tutti i file sono zippati posso senza problemi inserire:

    import.java.util.zip.*

    all'inizio? e poi il resto come lo cambio? credo siano solo le prime due righe a dover essere modificate o sbaglio? O forse è meglio inserire un blocco che mi faccia l'estrazione del file e poi una volta estratto un'altro blocco che me lo legge?
    Si accettano consigli...

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.