Ciclo for per più cartelle

di il
6 risposte

Ciclo for per più cartelle

Ciao a tutti,
Io ho una serie di cartelle '2000', '2001' etc... differenziate per anni e ognuna contiene dei file di testo. Io devo fare delle operazioni su questi file (operazioni di cui ho già scritto i comandi). Non sono molto pratico del comando dir, volevo sapere se c'è un modo (un ciclo for penso) per entrare in ognuna di queste cartelle, fare le operazioni sui file txt, e passare alla cartella successiva (siccome le cartelle sono una trentina è oneroso dover chiamare lo script che agisce sui file txt cartella una per una)
Grazie mille

6 Risposte

  • Re: Ciclo for per più cartelle

    La funzione dir ritorna l'elenco delle cartelle e dei files presenti nella cartella corrente in un vettore si struct.

    Puoi scandire il vettore ed identificare le cartelle verificando il valore del campo "isdir", come nel'esempio che segue.
    
    % Get the list of folders and files
    f=dir
    % Loop over over the files and folders
    % skip the firt two elements that are the folder . and ..
    for i=3:length(f)
        % if the "isdir flag is on, the current element is a folder name
        if(f(i).isdir)
            % Print the name of the forder, just for test
            f(i).name
            % Get the list of folders and files in the dir
            files_in=dir(f(i).name)
       else
           disp([f(i).name ' is not a floder'])
       end
    end
    
    Una volta identificata una cartella, puoi applicare lo stesso principio per ottenere la lista dei file contenuti in essa.
    Potrebbe essere utile (e semplificare gli script / funzioni) se aggiungessi le cartelle che ti interessano al path di MatLab (se le cartelle 2000, 2001 ecc sono tutte "sotto" un'unica cartella, basta aggiungere questa al path specificando di aggiungere anche le sottocartelle.
  • Re: Ciclo for per più cartelle

    Grazie mille dell'aiuto! Non riesco a capire cosa si intende per aggiungere le cartelle al path di matlab (le cartelle 2000, 2001 etc sono tutte sotto un'unica cartella)
  • Re: Ciclo for per più cartelle

    Il "path (https://www.mathworks.com/help/matlab/matlab_env/what-is-the-matlab-search-path.html) è un elenco di cartelle all'interno delle quali MatLab "cerca" uno script, un file, un file ".mat" ecc.

    Immaginavo che, dal momento che usi MatLab fossi a conoscenza del "concetto" di path in MatLab.

    Forse, invece, il mio ultimo commento ha generato confusione invece che fare chiareza.

    Se nelle cartelle "2000", "2001" ecc. non hai script da lanciare, puoi anche non inserirle nel path.
  • Re: Ciclo for per più cartelle

    Ho iniziato con Matlab da poco più o meno da autodidatta, alcuni concetti ancora mi mancano. Comunque grazie mille, darò un'occhiata e mi farò un'idea, ti ringrazio per l'aiuto!
  • Re: Ciclo for per più cartelle

    Scusami se rompo ancora, provo a farti vedere lo script che ho scritto e che mi da' errore.
    % Get the list of folders and files
    f=dir('C:\esempio');
    % Loop over over the files and folders
    % --> Skip the first two elements that are the folder '.' and '..'
    
    for i=3:length(f)
        % if the "isfolder flag is on, the current element is a folder name
        if isfolder(f(i).name)
            % Print the name of the forder, just for test
            disp(['folder: ' f(i).name]);
            
            % Get the list of folders and files in the dir
            txtfiles=dir(f(i).name);
     
            % Loop over the txt files
            for j=3:length(txtfiles)
                % open the file .txt
                fid=fopen(txtfiles(j).name,'r');
                % Print the name of file txt which is processing
                fprintf('Processing: \t', txtfiles(j).name);
                % load the file in a cellarray
                C=textscan(fid,'%s%s%f%f');
    
    Non aggiungo il resto del codice perchè diventa lungo, il problema è che mi da errore prima, nello specifico mi risulta fid=-1 e quando cerco di scansionare il file di testo ovviamente non me lo fa.
    C'è qualche errore?

    Inoltre, scusa se aggiungo anche questa domanda, volevo capire nello specifico perchè non funziona se, alla riga ""txtfiles=dir(f(i).name);"", sostituisco txtfiles=dir([f(i).name '*.txt']) che dovrebbe restituirmi i soli di testo nella cartella f(i) invece mi restituisce un empty struct
  • Re: Ciclo for per più cartelle

    Probabilmente è un problema di path dei files.
    In breve, visto che stai cercando di accedere a files all'interno di cartelle diverse da quella nella quale è presente lo script, nelle chiamate alla funzione "fopen" devio specificare il path completo dei file incluse le cartelle (es: c:\esempio\2000\ al quale aggiungere il nome del file).
    Puoi costruire il nome completo del file anche usando ala funzione

    In dettaglio:

    In quale cartella si trova lo script che hai pubblicato e che scandisce le varie cartelle?
    Soprattutto, dove si trova rispetto alla cartella "C:\esempio"?
    Dovresti provare ad eseguire il codice in modalità debug per verificare, innanzi tutto che le varie chiamate a "dir" vengano eseguite correttamente.

    Ammesso che ritornino gli elenchi corretti dei files considera questo scenario:

    [*] la prima ricerca viene fatta in "C:\esempio"
    [*] "dir" trova le cartelle "2000", "2001" ecc. (ad esempio)
    [*] nel loop interno, invochi "dir" per avere l'elenco dei files nelle cartelle "2000", "20001" ecc.
    [*] supponiamo che la prima cartella sia "2000" e che in essa vi sia il file "file_1.txt"
    [*] quando usi la funzione "fopen" per aprire il file, se non specifichi il path completo del file, la funzione lo cercherà nella cartella corrente e non nella cartella che credi
Devi accedere o registrarti per scrivere nel forum
6 risposte