Importare file txt

di il
5 risposte

Importare file txt

Salve,
dovrei importare in Matlab un file .txt così composto: data time testo
Ad esempio:
2015/04/05 10:02:26 andiamo tutti al mare
2015/04/05 10:03:30 prendiamo l'ombrellone
2015/04/05 12:10:35 torniamo da mare

2015/04/06 10:12:36 andiamo tutti al mare
2015/04/06 10:15:35 prendiamo l'ombrellone
2015/04/06 12:20:48 torniamo da mare

ecc ecc per n righe.
Inoltre, dovrei sommare i tempi relativi ad una determinata riga.
Ad esempio: somma dei tempi di 'prendiamo l'ombrellone' = 10:03:30 + 10:15:35 + ecc ecc.
Quale funzione devo utilizzare?

5 Risposte

  • Re: Importare file txt

    MatLab ha tantissime funzionalità e potenzialità, questo non vuol dire, però che debba essere usato per qualunque tipo di "problema".
    Nello specifico, secondo me, sarebbe molto più semplice creare uno script con, ad esempio, AWK o Python.
    Ad ogni modo, volendo / dovendo usare necessariamente MatLab, una (delle tante) possibili coluzioni (e probabilmente non la migliore) potrebbe essere:

    [*] leggere il file con la funzione "fgetl"
    [*] acquisire i "token" della riga (data, ora, attività) con la funzione "strtok"
    [*] assegnare i vari token ad una variabile (ad esempio una struttura o un cellarray)

    Una volta importato il contenuto del file all'interno di una struttura / cellarray si potrebbe scandire la stessa alla ricerca dell'attività di interesse (ad esempio, con riferimento alla domanda, "andiamo tutti al mare").
    Una volta trovata la stringa (attività) si hanno a disposizione le relative informazioni temporali (data e ora) dell'attività; su queste possono essere fatte somme, differenze ecc. (relativamente alla domanda, mi riesce difficile comprendere il senso di sommare gli orari ai quali una specifica attività viene effettuata)

    Le funzioni "datenum", "datevec", "datestr" ecc. possono essere utilizzate per manipolare / convertire "date" e "ore".

    Ancora relativamente alla domanda e, in particolare alla struttura del file di input: la struttura stringa che definisce le attività (es. "andiamo tutti al mare") può essere causa di difficoltà nella implementazione di un script.
    Di volta in volta essa è composta da un numero variabile di parole, le stesse, se non generate "automaticamente" al momento della scrittura nel file di testo, possono essere facilmente essere scritte in modo errato (es, una "doppia" dove non ci vuole o viceversa, come in "ombrelone" - dove "manca" una "l").
    Tutto questo (e altre situazioni simili) potrebbe avere la conseguenza che "lo script" non riconosca la stringa.

    Una possibile soluzione (se non fosse possibile modificare le stringhe) potrebbe consistere nell'identificare, per ogni tipologia di stringhe delle parole chiave e, quindi, usare queste nella ricerca (ad esempio: "andiamo", "prendiamo", "torniamo"); questo potrebbe limitare i pericoli sopra citati (ma non eliminarli).

    La soluzione proposta è stata implementata nello script che segue (il codice relativo alla seconda parte della domanda "somma dei tempi ..." non è stato implementato per i motivi sopra esposti tuttavia, nel codice è evidenziato il possibile punto nel quale tale codice potrebbe essere inserito).


    ATTENZIONE - CODICE RIMOSSO - LO SCRIPT CONTENEVA DUE ERRORI:
    DOPO L'ISTRUZIONE

    diario(i).data_ora=([data ' ' ora]);

    MANCAVA L'ISTRUZIONE

    diario(i).att=attivita;

    IL CODICE RIPORTATO IN QUESTA RISPOSTA E' STATO RIMOSSO.

    LA VERSIONE CORRETTA E' RIPORTATA NELLA RISPOSTA CHE SEGUE.

    SPIACENTE PER IL DISGUIDO

    
    
    CODICE RIMOSSO
    
    
    Hope this helps.
  • Re: Importare file txt

    Ciao, innanzitutto vorrei ringraziarti. Sono nuovo del forum e leggendo altri post ho constatato la tua disponibilità e celerità nel rispondere. In realtà, per quanto riguarda la somma dei tempi, a me servirebbe sapere il "tempo di permanenza" ovvero rispondere alla seguente domanda: quante ora sono stato al mare il giorno "x"? E poi: "nella settimana 'xy' quante ore ho trascorso al mare"? Quindi dovrei fare prima una differenza (giornaliera) e successivamente una somma (settimana, mese, anno). Provo subito ad eseguire il tuo codice. Grazie ancora
  • Re: Importare file txt


    ERRATA CORRIGE.
    SI RIPORTA, DI SEGUITO IL CODICE AGGIORNATO (REF. PRECEDENTE RISPOSTA PER I DETTAGLI)

    
    % 
    % Apertura del file di input
    % 
    fp=fopen('file_di_testo.txt','rt');
    % 
    % Inizializzazione contatore righe importate
    % 
    i=1;
    % 
    % Loop per la lettura del file di input
    % 
    while(1)
    %    
    %    Letrtura della i-esima riga
    %    
       l=fgetl(fp);
    %    
    %    Controllo raggiungimento della fine del file
    %    
       if(~ischar(l))
          break
       end
    %    
    %    Estrazione della data (primo campo della riga)
    %    
       [data,resto_riga]=strtok(l);
    %    
    %    Se la riga è vuota si passa alla lettura della riga successiva
    %    
       if(isempty(data))
          continue
       end
    %    
    %    Estrazione dell'ora (secondo campo della riga). Il resto della stringa
    %    viene assegnato alla stringa "attivita"
    %    
       [ora,attivita]=strtok(resto_riga);
    % 
    %    Assegnazione dei campi (data, ora, attivita) alla struttura "diario"
    %    
       diario(i).data_ora=([data ' ' ora]);
    %
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %
    %  BUG FIX: ISTRUZIONE AGGIUNTA %
    %
       diario(i).att=attivita;
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %    
    %    Incremento del contatore delle righe lette
    %    
       i=i+1;
    end
    % 
    % Chiusura del file di input
    % 
    fclose(fp);
    % 
    % Definizione delle parole chiave per l'individuazione delle stringhe
    % "attivita"
    % 
    key_word{1}='andiamo';
    key_word{2}='prendiamo';
    key_word{3}='torniamo';
    % 
    % Numero di parole chiave
    % 
    n_key_word=length(key_word);
    % 
    % Loop per la ricerca delle attivita:
    % Loop esterno sulle parole chiave
    % Loop interno sulle righe lette (diario)
    % 
    for i=1:n_key_word
       for j=1:length(diario)
    %       
    %       Se la parola chiave viene trovata, viene eseguito il codice definito all'interno del blocco "if"
    %       
          if(strfind(diario(j).att,key_word{i}))
    %          
    %          Placeholder per il codice da eseguire se viene trovata la
    %          pariola chiave
    %          
          end
       end
    end
    
  • Re: Importare file txt

    Per calcolare le durate dei vari eventi (es. tempo di permanenza al mare) si può usare una combinazione delle funzioni "datenum", "datestr" e "datevec".

    Lo script che segue è una versione modifica del precedente.
    La sezione modificata è quella successiva alla inizializzazione del cellarray "key_word".
    
    % 
    % Apertura del file di input
    % 
    fp=fopen('file_di_testo.txt','rt');
    % 
    % Inizializzazione contatore righe importate
    % 
    i=1;
    % 
    % Loop per la lettura del file di input
    % 
    while(1)
    %    
    %    Letrtura della i-esima riga
    %    
       l=fgetl(fp);
    %    
    %    Controllo raggiungimento della fine del file
    %    
       if(~ischar(l))
          break
       end
    %    
    %    Estrazione della data (primo campo della riga)
    %    
       [data,resto_riga]=strtok(l);
    %    
    %    Se la riga è vuota si passa alla lettura della riga successiva
    %    
       if(isempty(data))
          continue
       end
    %    
    %    Estrazione dell'ora (secondo campo della riga). Il resto della stringa
    %    viene assegnato alla stringa "attivita"
    %    
       [ora,attivita]=strtok(resto_riga);
    % 
    %    Assegnazione dei campi (data, ora, attivita) alla struttura "diario"
    %    
       diario(i).data_ora=([data ' ' ora]);
       diario(i).att=attivita;
       
    %    
    %    Incremento del contatore delle righe lette
    %    
       i=i+1;
    end
    % 
    % Chiusura del file di input
    % 
    fclose(fp);
    % 
    % Definizione delle parole chiave per l'individuazione delle stringhe
    % "attivita"
    % 
    key_word{1}='andiamo';
    key_word{2}='prendiamo';
    key_word{3}='torniamo';
    % 
    % Numero di parole chiave
    % 
    n_key_word=length(key_word);
    % 
    % Inizializzazine contatore
    % 
    cnt=0;
    % 
    % Loop per la ricerca delle attivita: acquisizione "giorno" e ora "inizio"
    % (andiamo) e "fine" (torniamo)
    %
    for j=length(diario):-1:1
       if(strfind(diario(j).att,key_word{3}))
          cnt=cnt+1;
          str_tor{cnt}=diario(j).data_ora;
       elseif(strfind(diario(j).att,key_word{1}))
          str_and{cnt}=diario(j).data_ora;
       end
    end
    % 
    % Calcolo durata singolo giorno
    % 
    for i=cnt:-1:1
    %    
    %    Calcolo durata
    %    
       diff_num=datenum(str_tor{i})-datenum(str_and{i});
    %    
    %    Conversione nel formato dd-mmm-yyyy HH:MM:SS
    %    
       tmp_data=datestr(diff_num,'dd-mmm-yyyy HH:MM:SS');
    %    
    %    Scomposizione delle componenti nella matrice dett_tempo (una riga per
    %    ogni giorno). Gli ultimi tre elementi del vettore contengono,
    %    rispettivamente "ore", "minuti", "secondi" della permanenza
    %    
       dett_tempo(i,:)=datevec(tmp_data);
    %    
    %    Stampa della durata
    %    
          sprintf('Giorno %s: %d ore %d minuti %d secondi',strtok(str_tor{i}),dett_tempo(i,4:end))
    end
    % 
    % Calcolo tempo totale
    % 
    % Verifica numero secondi > 60
    % 
    add_min=0;
    sec_tot=sum(dett_tempo(:,end));
    if(sec_tot >= 60)
       add_min=floor(sec_tot/60);
       sec_tot=single((sec_tot/60-floor(sec_tot/60))*60);
    end
    % 
    % Verifica numero minuti > 60
    % 
    add_ore=0;
    min_tot=sum(dett_tempo(:,end-1))+add_min;
    if(min_tot >= 60)
       add_ore=floor(min_tot/60);
       min_tot=single((min_tot/60-floor(min_tot/60))*60);
    end
    % 
    % Verifica numero ore > 24
    % 
    add_gio=0;
    ore_tot=sum(dett_tempo(:,end-2))+add_ore;
    if(ore_tot >= 24)
       add_gio=floor(ore_tot/24);
       ore_tot=single((ore_tot/24-floor(ore_tot/24))*24);
    end
    %
    % Stampa del tempo totale di permanenza in:
    % "ore" (somma della quarta colonna della matrice dett_tempo)
    % "minuti" (somma della quinta colonna della matrice dett_tempo)
    % "secondi" (somma della sesta colonna della matrice dett_tempo)
    % 
    if(add_gio)
       sprintf('Tempo totale %d giorni %d ore %d minuti %d secondi',add_gio,ore_tot,min_tot,sec_tot)
    else
       sprintf('Tempo totale %d ore %d minuti %d secondi',ore_tot,min_tot,sec_tot)
    end
    
    Hope this helps.
  • Re: Importare file txt

    Grazie!
    Funziona...!!!!!per ora con pochi dati e con una struttura semplice del txt funziona.

    Grazie ancora
Devi accedere o registrarti per scrivere nel forum
5 risposte