Caricare e leggere file multipli da una stessa directory

di il
4 risposte

Caricare e leggere file multipli da una stessa directory

Ciao a tutti, ringrazio in anticipo chi mi darà una mano visto che sono neofita in Matlab.
Io ho una serie di file di testo .txt (~250) in una stessa cartella, ho bisogno di caricarli tutti insieme, leggerle le righe di ciascun file e assegnare a una nuova matrice dei valori (presenti in ogni riga) che mi servono . Questi file contengono dei dati che hanno tutti la stessa struttura, quindi per farlo avevo creato una funzione di parsing delle righe (utilizzando sscanf) e assegnando poi a una matrice i valori. Il problema è che farlo per 250 files è proibitivo, quindi chiedevo se c'è un modo per caricarli insieme, leggere le righe di ognuno e assegnare i valori a una matrice (o anche a più matrici, una per ciascun file, e poi le unisco sequenzialmente).
Se non sono stato chiaro o c'è bisogno di un esempio, ditemi pure, vi ringrazio

4 Risposte

  • Re: Caricare e leggere file multipli da una stessa directory

    La domanda è troppo vaga.
    Per automatizzare la lettura di più file puoi usare la funzione dir per ottenere l'elenco dei nomi dei files; quindi puoi creare un loop per scorrere la lista ed importare i dati.
    In alternativa, se i nomi dei files hanno una struttura specifica (es. file_1.txt, file_2.txt ecc.) puoi generare i nomi dei files, all'interno di un loop, concatenando la parte comune (continuando con l'esempio precedente, "file_" con i valori numerici progressivi (convertiti in formato "stringa" con la funzione num2str.

    Per la lettura dei files e l'assegnazione dei valori a delle matrici, le informazioni che hai fornito non sono sufficienti; occorre conoscere la struttura dei file per poter dare qualche indicazione.

    Lo stesso vale per definire una strategia per la scelta della struttura dati più opportuna per memorizzare i dati letti.
    Dal momento che li leggerai in un ciclo "for", bisogna capire come li dovrai utilizzare; scarterei a priori la possibilità di caricarli in matrici differenti perchè dovresti crearle in modo dinamico.

    Per mantenere separati i dati di ogni file (ammesso che sia quello che ti serve) potresti caricarli in una struttura, creando un campo per ogni file.
    L'uso del tipo dati "struct" consente di definire in modo dinamico i nomi dei campi.

    In mancanza di ulteriori informazione, purtroppo, non si può dire molto di più.
  • Re: Caricare e leggere file multipli da una stessa directory

    D'accordo, cerco di essere più specifico.
    Ho 251 file txt (alcuni nomi hanno una radice simile e altri no) costituiti da tante righe che hanno tutte una struttura del seguente tipo:
    "2003-01-01 00:15:00;V;3.4;0"
    Io avevo creato il seguente script per la lettura di ciascuna riga del file (tramite la function 'parse_line' e assegnazione alla matrice vento dei dati che mi servono (ovvero la velocità V soprattutto e avevo aggiunto il giorno mese e anno).
    Il mio problema è che non sono in grado di farlo tramite un ciclo for, selezionando insieme tutti i file e assegnando a un'unica o a più matrici i valori che desidero.

    >> [filename,pathname]=uigetfile('*.txt');
    fullfilename=strcat(pathname,filename);
    fid=fopen(fullfilename,'r');
    % lettura del file fino in fondo e
    % memorizzazione delle coordinate in una matrice
    ls=0;
    vento=[];
    while not(feof(fid))
    txtline=fgetl(fid); % legge la riga iniziale
    if ~isempty(txtline)
    [anno,mese,gg,v]=parse_line(txtline);
    end
    ls=ls+1;
    vento(ls,1)=v;
    vento(ls,2)=gg;
    vento(ls,3)=mese;
    vento(ls,4)=anno;
    % creazione man mano della matrice delle coordinate
    end
    status=fclose('all');

    La funzione è invece:
    >> function [anno,mese,gg,v]=parse_line(txtline)
    anno=0;
    mese=0;
    gg=0;
    v=0;
    anno = sscanf(txtline(1:4),'%f');
    mese = sscanf(txtline(6:7),'%f');
    gg = sscanf(txtline(9:10),'%f');
    v = sscanf(txtline(23:25),'%f');
  • Re: Caricare e leggere file multipli da una stessa directory

    La cosa più semplice che puoi fare è: identificare la lista dei files di input con la funzione "dir" e creare un loop per leggerli in sequenza.
    Usandola bisogna fare attenzione a due particolari: se nella cartella ci potrebbero essere files di testo che non si vogliono leggere / importare, i file verranno letti in ordine alfabetico (rispetto al loro nome).

    Puoi leggere i file con la funzione "textscan" che è in grado di leggere tutto il file in una volta evitando il loop che stai usando e, quindi, la funzione "parse_line".

    La funzione "textscan" ritorna il contenuto del file in un cellarray, basterà quindi estrarre da esso i dati e concatenarli nel loop di lettura.

    Nell'esempio che segue, vengono letti i due file di testo e viene creata una matrice con i valori estratti.

    a.txt
    
    2003-01-04 00:15:00;V;31.4;0
    2003-02-05 00:15:00;V;32.4;0
    2003-03-06 00:15:00;V;33.4;0
    a.txt
    
    2003-04-07 00:15:00;V;331.4;0
    2003-05-08 00:15:00;V;332.4;0
    2003-06-09 00:15:00;V;333.4;0
    
    % Get the list of files
    f_names=dir('*.txt')
    % Initialize the output raays
    date=[]
    v=[]
    vento=[]
    % Loop over the input files
    for i=1:length(f_names)
       % Open the FIle
       fid=fopen(f_names(i).name,'r');
       % Load the file in a cellarray
       C=textscan(fid,'%s%s%f%f','delimiter',';');
       % Extract the data in the output matrices
       date=[date;datevec(C{1})]
       v=[v;C{3}]
       vento=[vento; datevec(C{1}) C{3}]
       fclose(fid)
    end
    
    Il codice genera la matrice "vento":
    
    vento =
    
     Columns 1 through 6:
    
       2003.00000      1.00000      4.00000      0.00000     15.00000      0.00000
       2003.00000      2.00000      5.00000      0.00000     15.00000      0.00000
       2003.00000      3.00000      6.00000      0.00000     15.00000      0.00000
       2003.00000      4.00000      7.00000      0.00000     15.00000      0.00000
       2003.00000      5.00000      8.00000      0.00000     15.00000      0.00000
       2003.00000      6.00000      9.00000      0.00000     15.00000      0.00000
    
     Column 7:
    
         31.40000
         32.40000
         33.40000
        331.40000
        332.40000
        333.40000
    e, nel caso servissero, le matrici "date" (date lette dal file) e "v" (i valori corrisposndenti.

    Leggendo le date come stringa ed utilizzando la funzione "datevec" si possono separare facilmente le componenti della data e scegliere quali inserire nella matrice di output.
  • Re: Caricare e leggere file multipli da una stessa directory

    Ti ringrazio infinitamente, sei stato gentilissimo grazie dell'aiuto!
Devi accedere o registrarti per scrivere nel forum
4 risposte