[MATLAB] Nombre de fichiers dans un dossier

Résolu
Newenda Messages postés 83 Statut Membre -  
 159753123 -
Bonjour,

J'aimerais sous matlab, avoir le nombre de fichiers dans un dossier pour pouvoir réaliser une boucle de lecture de tous ces fichiers. Cependant si une fonction matlab permet de lire tous les fichiers sans avoir besoin du nombre exacte de fichiers, je suis preneur aussi.

question bonus : les commandes cd, ls etc... marche-t-elle sous matlab windows..il me semble que non..

Merci bien d'avance
Configuration: Windows XP
Firefox 2.0.0.20

25 réponses

  • 1
  • 2
  1. Newenda Messages postés 83 Statut Membre 24
     
    Bonjour,

    Merci bien, je tenais à signaler que,

    1/ quand je poste ici, j'ai généralement fait le tour des forums et aide matlab, je pensais que quelqu'un aurait un solution simple (il est impossible de trouver un tuto digne de ce nom pour l'ouverture des fichiers matlab)

    par exemple peut on pas tout ouvrir en écrivant simplement débutNomCommmun*.txt après d'avoir dirigé matlab sur l'ensemble des dossiers?

    2/J'ai posté mon 2eme message pour essayer d'être plus précis que le premier pour avoir l'aide approprié.

    3/J'ai posté deux fois le 2ème message, et je m'en excuse, pour la simple raison que j'ai cru qu'il y avait eu un bug et qu'il n'avait pas été posté.

    4/"Les Assistés de la vie" ça n'existe pas. Et la condescendance c'est bien l'impolitesse des gens qui se sentent obliger de l'être.
    21
    1. de
       
      La solution est très facile,
      Avec dirName le nom du répertoire entrée;
      On recupère en sortie noofiles : le nombre de fichier qui il y a dans le répertoire et garb: le nombre de répertoire

      if dirName==0
      fileSorted=[];
      disp(' Empty directory ');
      else
      D=dir(dirName);
      [nooffilesf garb]=size(D);
      fileX = [];
      for i=3:nooffilesf
      % this assumes that the first and second are . and ..
      % uncomment the if statement below if you want to select only
      % filenames starting with some characters say 'im' in this example
      % similarly we can have a condition to check if the files end in
      % say .dcm
      fileX(i-2).name = D(i).name;
      end

      [garb nooffiles]=size(fileX);
      0
  2. Sacabouffe Messages postés 9427 Date d'inscription   Statut Membre Dernière intervention   1 863
     
    Salut

    Pas la peine de poster ton sujet 3 fois sur le forum, t'auras pas de réponse plus rapidement, bien au contraire.

    CCM - Charte - Respect d'autrui
    ne pas poster votre message plusieurs fois sur le forum
    http://www.commentcamarche.net/forum/affich 11600272 matlab traitements ascii dans dossiers
    http://www.commentcamarche.net/forum/affich 11601175 matlab boucle lecture fichiers dans dossier

    En référence à ce sujet, quand des dossiers ou des fichiers ont des espaces, faut mettre des apostrophes...
    cd D:\Travail\'DOSSIER TEST'\'TEST BOUCLE'\
    En référence à ce sujet, pour traiter tous les fichiers d'un dossier, on va pas tout faire à ta place, alors au lieu de poster 3 fois pour avoir une réponse plus rapidement, faudrait peut-être penser à lire les réponses qui te sont données et à réfléchir un minimum pour répondre toi-même à la question en trois coups de cuillère à pot ; les assistés de la vie, ça commence à bien faire. Char Snipeur dans son message 3 te disait que tu pouvais définir un tableau de caractères en faisant simplement A=ls; ; ce que j'ai confirmé au message 5 en précisant que dans le tableau de caractères obtenu, il y avait . et .. dont il fallait pas s'occuper, avec ça je vois pas où est le problème...
    cd le_dossier_où_il_faut_aller
    A=ls;
    for p=3:size(A,1)
    fid=fopen(A(p,:),'r');
    %% Lire avec ce que tu veux...
    %% fread, fscanf, fgets, fgetl, textscan
    fclose(fid);
    end
    Ou encore
    cd le_dossier_où_il_faut_aller
    A=ls;
    for p=3:size(A,1)
    %% Lecture avec textread
    %% du fichier de nom A(p,:)
    end
    Ciao
    8
    1. 159753123
       
      est ce qu'il existe une foction qui me permet de lire plusieurs images a la fois dans matlab
      0
  3. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    Je pense que les commandes matlab fonctionnent sous windows, de mon souvenir.
    2
  4. Newenda Messages postés 83 Statut Membre 24
     
    Merci, j'ai essayé ça :

    -----------------------------------------------------------------------------------
    clear all
    close all

    A=rdir('D:\Travail\DOSSIER_TEST\TEST_BOUCLE\test0*\*.txt');

    for p=1:size(A,1)

    fid=fopen(A(p).name,'r');

    %% Traitement du fichier

    N = 15; % N = Nombre de ligne à passer
    for n=1:N;
    fgetl(fid);
    end;

    %fréquence échantillonage
    f_ech = 10000;

    %tmax = temps d'enregistrement d'un événement
    tmax = 0.5002;

    %axe de temps
    t = [0:1/f_ech:tmax-1/f_ech];
    t=t';

    % Lecture des données qui se trouvent sur deux colonnes
    donnee=fscanf(fiche,'%g %g',[2 inf]);

    % Mettre le vecteur de donnees dans le bon ordre
    donnee=donnee';

    voie1 = donnee(:,1);
    voie2 = donnee(:,2);

    voie1_fft = fft(voie1);

    %fréquence pas
    freq = [0:1/tmax:f_ech-1/tmax];
    freq = freq';
    %spectre d'énergie

    spi = abs(voie1_fft).^2; %voie1_fft.*conj(voie1_fft)

    figure
    plot(freq, spi);

    fclose(fid);

    end
    ------------------------------------------------------------------------------

    Mais il me retourne :

    ***************************************
    ??? Error using ==> fgetl
    Invalid file identifier.

    Error in ==> OuvertureFichier_3 at 13
    fgetl(fid);

    ***************************************

    La ligne 13 (erreur) est au niveau de la boucle pour dépasser l'entête du fichier.. pourquoi ne reconnait il pas le fid à cet endroit, Il semble pourtant ne pas y avoir de raison !

    Merci
    1
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Newenda Messages postés 83 Statut Membre 24
     
    Merci mais reste ma question à 10 euros :)
    0
  7. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    Ne peut tu pas récupérer la sortie de ls ? genre :
    A=ls ?
    0
  8. Sacabouffe Messages postés 9427 Date d'inscription   Statut Membre Dernière intervention   1 863
     
    Salut

    Oui oui, ça marche très bien comme ça.
    On peut même prendre directement la taille de ls en enlevant 2 à cause de . et ..
    nb_fichiers=size(ls,1)-2;
    Bonne nuit
    0
  9. Sacabouffe Messages postés 9427 Date d'inscription   Statut Membre Dernière intervention   1 863
     
    par exemple peut on pas tout ouvrir en écrivant simplement débutNomCommmun*.txt après d'avoir dirigé matlab sur l'ensemble des dossiers?

    Genre shell ou batch... mais dans le fond, un truc comme ça, c'est rien d'autre qu'une boucle sur l'ensemble des fichiers du(des) dossier(s). Je pense pas que cette syntaxe soit possible sous Matlab, mais peut-être que je me trompe... du moins pour ouvrir les fichiers je veux dire. Sinon ls *.txt marche très bien par exemple.
    Mais si tu veux que tous les fichiers soient tous ouverts et pas les ouvrir et les refermer un à un comme j'ai écrit, un truc du genre devrait faire l'affaire...
    cd le_dossier_où_il_faut_aller
    A=ls;
    for p=3:size(A,1)
    eval(['fid' num2str(p) '=fopen(A(p,:),''r'');']);
    end
    %% Blablabla...
    fclose all
    Ils seront tous ouverts avec les identifiants fid1, fid2, fid3, fid4, etc, etc...
    Mais ta demande était de les lire un par un.
    Comment écrire une boucle simple qui lirait les fichiers un par un des deux dossiers ?

    Apparemment t'as moult dossiers aussi, sous Unix/Linux, tu peux passer tous les flags supportés par ton OS à la commande ls. Donc ls -R pour un listing récursif.
    Pour Windows, je sais pas s'il y a moyen de faire ça rapidos, mais tu peux aller télécharger le Recursive directory listing sur le File Exchange de Mathworks :
    https://www.mathworks.com/matlabcentral/fileexchange/19550-recursive-directory-listing

    Bon après-midi
    0
  10. Sacabouffe Messages postés 9427 Date d'inscription   Statut Membre Dernière intervention   1 863
     
    Et du coup, en référence aux précisions apportées dans ce sujet, un bidule de ce genre ferait l'affaire...
    A=rdir('C:\2009\**\*.txt');
    for p=1:size(A,1)
    fid=fopen(A(p).name,'r');
    %% Traitement du fichier
    fclose(fid);
    end
    Ciao
    0
  11. Sacabouffe Messages postés 9427 Date d'inscription   Statut Membre Dernière intervention   1 863
     
    Salut

    Pour débogage, relance le code avec ces petites modifications :
    blablabla...
    A=rdir('D:\Travail\DOSSIER_TEST\TEST_BOUCLE\test0*\*.txt');
    for p=1:size(A,1)
    disp(A(p).name)
    [fid message]=fopen(A(pbug).name,'r')
    blablabla...
    T'as quoi comme sortie écran ?
    0
  12. Newenda Messages postés 83 Statut Membre 24
     
    ??? Undefined function or variable "pbug".

    Error in ==> OuvertureFichier_3 at 7
    [fid message]=fopen(A(pbug).name,'r')

    aie...
    0
  13. Sacabouffe Messages postés 9427 Date d'inscription   Statut Membre Dernière intervention   1 863
     
    T'aurais pu corriger... ;-)
    Le pbug restait d'une modif que j'ai faite dans mon message.
    blablabla...
    A=rdir('D:\Travail\DOSSIER_TEST\TEST_BOUCLE\test0*\*.txt');
    for p=1:size(A,1)
    disp(A(p).name)
    [fid message]=fopen(A(p).name,'r')
    blablabla...
    0
  14. Newenda Messages postés 83 Statut Membre 24
     
    Parfait, maintenant cela fonctionne (désolé, persuadé que pbug était une sorte de fonction caché de matlab que j'avais pas, en même j'aurais du m'en douter quand j'ai essayé de la chercher sur google et que j'ai rien trouvé).

    Un bémol cependant, je pense que matlab ne reconnait pas cette forme : \test0*\ . Je voulais ouvrir en boucle tous les dossiers ayant le nom test01, test02 etc.. tant pis.

    En tout merci bien sacabouffe
    0
  15. Sacabouffe Messages postés 9427 Date d'inscription   Statut Membre Dernière intervention   1 863
     
    De rien ;-)

    Mais je comprends pas bien ton bémol, A=rdir('D:\Travail\DOSSIER_TEST\TEST_BOUCLE\test0*\*.txt'); te donne la liste de tous les fichiers d'extension .txt contenus dans les dossiers commençant par D:\Travail\DOSSIER_TEST\TEST_BOUCLE\test0, donc
    D:\Travail\DOSSIER_TEST\TEST_BOUCLE\test01
    D:\Travail\DOSSIER_TEST\TEST_BOUCLE\test02
    etc...
    C'est bien c que tu voulais faire, t'ouvres tout à la suite après ça...

    À moins que tu parles d'utiliser la syntaxe en dehors de la fonction rdir, effectivement, elle est pas reconnue. :-(

    À la prochaine
    0
  16. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    Salut.
    D'un certain coté, MATLAB n'est pas un shell, alors je trouve ça normal qu'il ne comprenne pas par défaut le caractère joker.
    Pour précision, j'ai matlab6, et A=ls ne fonctionne pas. A=dir fonctionne, mais je me retrouve avec un tableau de structure à la con.
    0
  17. Sacabouffe Messages postés 9427 Date d'inscription   Statut Membre Dernière intervention   1 863
     
    Salut Char Snipeur

    En fait, il le reconnaît. Mais sous Windows, c'est reconnu seulement pour des syntaxes simples comme ls *.m
    Un truc du genre ls Data*/*.txt passera sous Linux mais pas sous Windows. En même temps, c'est un peu normal puisque cette syntaxe est pas reconnue par Windows lui-même.

    Et le A=dir;, c'est pas une structure à la con ! :-D
    La liste des fichiers est contenu dans A.name, comme pour rdir utilisé pour le listing récursif et récupéré sur le file exchange, c'est juste une extension du dir par défaut de Matlab. Enfin... si c'est pareil avec la version 6, mais vu que A=ls; marche pas, y a peut-être des différences pour le A=dir; aussi.

    Bonne journée
    0
    1. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
       
      Oui, c'est ce que je voulais préciser : pour ma version 6.
      A=dir, revoi un tableau de structure.
      A(1) est une structure avec comme membre 'name' mais aussi, les attributs, les dates de modif, la taille.
      Et je n'ai pas réussi à convertir cette structure simplement en tableau (l=A.name échoue).
      Donc, voilà c'était juste pour compléter le message au cas où quelqu'un avec une vielle version tomberai dessus.
      Si quelqu'un a le souci, il faut passer par des boucles.
      0
  18. Sacabouffe Messages postés 9427 Date d'inscription   Statut Membre Dernière intervention   1 863
     
    Je sais pas si avec ta version ça tournera, mais essaie ça ;-)
    A=dir;
    B=strvcat(A.name);
    Si tout se passe bien, tu devrais obtenir un tableau de caractères.

    Si tu préfères l'avoir en tableau de cellules de caractères, un truc de ce genre devrait coller ;-)
    A=dir;
    B={A.name};
    0
  19. Newenda Messages postés 83 Statut Membre 24
     
    pas moyen...

    A=rdir('D:\Travail\DOSSIER_TEST\HUGE_TEST\**\**\**\**\*.txt');

    il ne lit rien et pourtant il y a bien des fichiers texte dans

    D:\Travail\DOSSIER_TEST\HUGE_TEST\08\01\31\17

    ??
    0
  20. Sacabouffe Messages postés 9427 Date d'inscription   Statut Membre Dernière intervention   1 863
     
    Salut

    La syntaxe est celle-ci de toute façon :
    A=rdir('D:\Travail\DOSSIER_TEST\HUGE_TEST\**\*.txt'­);
    Ciao
    0
  21. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    Pour reprendre le message fermé. Où est le problème de stocker 10.000 noms dans A grâce à rdir ?
    Je pense qu'il faudrait que tu apprennes à utiliser l'aide de MATLAB, il existe plein de fonctions diverses et varié, et je suis sur qu'en cherchant un peu tu trouverai.
    Par exemple en moins d'une minutes, sur www.mathworks.com j'ai trouvé la fonction "exist" qui permet de tester si un fichier existe (entre autre), et qui pourrait t'aider dans tes boucle si rdir te rebute à ce point là.
    0
  • 1
  • 2