Importare dati da excel

di il
5 risposte

Importare dati da excel

Buongiorno a tutti.
Volevo sottoporvi questo quesito che non riesco a risolvere circa l'importazione di dati da excel.
In input ho un vettore che può avere diverse componenti, es
ZS = [904 905 906]
Ora vorrei che il programma leggesse i fogli di un excel chiamati 904, 905, 9060 e mi restituisse 3 matrici (ZS1, ZS2, ZS3) con i valori presenti in ogni foglio.
Logicamente le componenti del vettore iniziale possono variare.
Scusate, magari la domanda è banale, ma non ne esco.
Grazie

5 Risposte

  • Re: Importare dati da excel

    Purtroppo non ho Excel e quindi non posso testare la risposta, ma, stando alla documentazione di MatLab



    puoi specificare il nome del "foglio" da leggere in due modi:

    [*] specificando il nome del foglio come "stringa"
    [*] specificando il nome come "numero", in questo caso il numero rappresenta "l'indice" del foglio

    Nel tuo caso, dal momento che mi sembra di capire che i valori all'interno del vettore rappresentino il "nome" del foglio, potresti provare a convertire il valori numerici contenuti nel vettore con la funzione "num2str" e passare la stringa che ottieni come input a "xlsread"

    Per ulteriori informazioni ed esempi:

    http://uk.mathworks.com/help/matlab/ref/xlsread.html#btg5vmt-3
    http://uk.mathworks.com/matlabcentral/answers/55793-how-to-read-multiple-excel-tabs-each-as-a-separate-matrix
    http://uk.mathworks.com/matlabcentral/newsreader/view_thread/263604
  • Re: Importare dati da excel

    Grazie.
    Ho provato e sono arrivato a questo:

    ZS = [904 905 906]

    n_zone = numel(ZS)

    for i = 1:n_zone
    z{i} = zeros;
    s{i} = zeros;
    a{i} = zeros;
    z{i} = num2str(ZS(i))
    s{i} = strcat('ZS',z{i})
    a{i} = xlsread ('ZS9_totale2.xlsx',s{i})
    end

    fin qua funziona e legge tutto correttamente, il problema ora è fargli capire che i tre elementi di a {i} sono delle matrici.
    Questo è ciò che ottengo:

    a = [5x2 double] [11x2 double] [11x2 double]
  • Re: Importare dati da excel

    Ammesso che tu non voglia lavorare direttamente con il cellarray "a", ci sono diverse possibilità per "estrarre" le matrici dal cellarray; due possibilità sono:

    [*] racchiudere l'i-esimo elemento all'interno di parentesi quadre
    
    [a{1}]
    
    [*] usare la funzione "cell2mat"
    
    cell2mat(a(i))
    
    Quello che conta, però, è come assegnare le varie matrici a delle "variabili".

    Nel caso tu sappia in anticipo il numero di matrici e se queste sono "poche", puoi scrivere direttamente qualcosa del tipo:
    
    m1=[a{1}]
    m2=[a{2}]
    m3=[a{3}]
    
    oppure
    
    m1=cell2mat(a(1))
    m2=cell2mat(a(2))
    m3=cell2mat(a(3))
    

    Se non conosci il numero di matrici, o se questo può variare a seconda del file Excel, la soluzione migliore potrebbe essere assegnare le matrici a dei capi di una struttura, sfruttando i fatto che MatLab consente la creazione dinamica dei nomi dei campi:
    
    for i=1:length(a)
       the_struct.(['m' num2str(i)])=[a{i}]
    end
    
  • Re: Importare dati da excel

    Grazie mille! Il caso con numero variabile di matrici è proprio il mio. Ora come posso richiamare la matrice, nominare alcune colonne e far conti?
    per esempio vorrei estrarre da m1 =>xv1 e yv1 e lo stesso per le altre matrici.
    Grazie
  • Re: Importare dati da excel

    Come ho scritto nella precedente risposta, nel caso il numero delle matrici contenute nel cellarray non sia noto a priori, un buon metodo è quello di assegnare le varie matrici ai campi di una struttura (vedi codice nella precedente risposta).

    Puoi assegnare ai campi della matrice i nomi dei fogli del file Excel dal quale hai letto i dati: se nel tuo caso i nomi erano i valori del vettore ZS = [904 905 906]:
    
    ZS = [904 905 906]
    
    for i=1:length(a)
       my_struct.(['foglio_' num2str(ZS(i))])=cell2mat(a(i))
    end
    
    La struttura avrà i seguenti campi:
    
    my_struct = 
    
        foglio_904: [5x2 double]
        foglio_905: [11x2 double]
        foglio_906: [11x2 double]
    
    
    Non capisco cosa intendi con estrarre da m1 =>xv1 e yv1.

    Cosa sono xv1 e yv1?

    Ad ogni modo, per esempio:
    my_struct.foglio_904
    conterrà la prima matrice del cellarray "a" (che hai descritto nella tua seconda domanda).

    Puoi lavorare direttamente con la struttura od utilizzare una variabile temporanea:
    m1=my_struct.foglio_904
Devi accedere o registrarti per scrivere nel forum
5 risposte