[MATLAB] Nombre de fichiers dans un dossier

Résolu/Fermé
Signaler
Messages postés
75
Date d'inscription
lundi 1 décembre 2008
Statut
Membre
Dernière intervention
26 avril 2021
-
 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

25 réponses

Messages postés
75
Date d'inscription
lundi 1 décembre 2008
Statut
Membre
Dernière intervention
26 avril 2021
23
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.
20
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
Messages postés
9418
Date d'inscription
dimanche 19 août 2007
Statut
Membre
Dernière intervention
29 mai 2009
1 864
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
est ce qu'il existe une foction qui me permet de lire plusieurs images a la fois dans matlab
0
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 331
Je pense que les commandes matlab fonctionnent sous windows, de mon souvenir.
2
Messages postés
75
Date d'inscription
lundi 1 décembre 2008
Statut
Membre
Dernière intervention
26 avril 2021
23
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
Messages postés
75
Date d'inscription
lundi 1 décembre 2008
Statut
Membre
Dernière intervention
26 avril 2021
23
Merci mais reste ma question à 10 euros :)
0
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 331
Ne peut tu pas récupérer la sortie de ls ? genre :
A=ls ?
0
Messages postés
9418
Date d'inscription
dimanche 19 août 2007
Statut
Membre
Dernière intervention
29 mai 2009
1 864
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
Messages postés
9418
Date d'inscription
dimanche 19 août 2007
Statut
Membre
Dernière intervention
29 mai 2009
1 864
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
Messages postés
9418
Date d'inscription
dimanche 19 août 2007
Statut
Membre
Dernière intervention
29 mai 2009
1 864
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
Messages postés
9418
Date d'inscription
dimanche 19 août 2007
Statut
Membre
Dernière intervention
29 mai 2009
1 864
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
Messages postés
75
Date d'inscription
lundi 1 décembre 2008
Statut
Membre
Dernière intervention
26 avril 2021
23
??? Undefined function or variable "pbug".

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



aie...
0
Messages postés
9418
Date d'inscription
dimanche 19 août 2007
Statut
Membre
Dernière intervention
29 mai 2009
1 864
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
Messages postés
75
Date d'inscription
lundi 1 décembre 2008
Statut
Membre
Dernière intervention
26 avril 2021
23
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
Messages postés
9418
Date d'inscription
dimanche 19 août 2007
Statut
Membre
Dernière intervention
29 mai 2009
1 864
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
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
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
Messages postés
9418
Date d'inscription
dimanche 19 août 2007
Statut
Membre
Dernière intervention
29 mai 2009
1 864
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
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
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
Messages postés
9418
Date d'inscription
dimanche 19 août 2007
Statut
Membre
Dernière intervention
29 mai 2009
1 864
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
Messages postés
75
Date d'inscription
lundi 1 décembre 2008
Statut
Membre
Dernière intervention
26 avril 2021
23
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
Messages postés
9418
Date d'inscription
dimanche 19 août 2007
Statut
Membre
Dernière intervention
29 mai 2009
1 864
Salut

La syntaxe est celle-ci de toute façon :
A=rdir('D:\Travail\DOSSIER_TEST\HUGE_TEST\**\*.txt'­);
Ciao
0
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
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