[MATLAB] Nombre de fichiers dans un dossier

Résolu/Fermé
Newenda Messages postés 75 Date d'inscription lundi 1 décembre 2008 Statut Membre Dernière intervention 26 avril 2021 - 18 mars 2009 à 12:19
 159753123 - 22 mai 2015 à 16:12
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
A voir également:

25 réponses

Newenda Messages postés 75 Date d'inscription lundi 1 décembre 2008 Statut Membre Dernière intervention 26 avril 2021 24
19 mars 2009 à 14:26
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
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
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
19 mars 2009 à 13:19
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
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
18 mars 2009 à 13:41
Je pense que les commandes matlab fonctionnent sous windows, de mon souvenir.
2
Newenda Messages postés 75 Date d'inscription lundi 1 décembre 2008 Statut Membre Dernière intervention 26 avril 2021 24
20 mars 2009 à 09:45
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Newenda Messages postés 75 Date d'inscription lundi 1 décembre 2008 Statut Membre Dernière intervention 26 avril 2021 24
18 mars 2009 à 14:42
Merci mais reste ma question à 10 euros :)
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
18 mars 2009 à 15:30
Ne peut tu pas récupérer la sortie de ls ? genre :
A=ls ?
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
19 mars 2009 à 02:01
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
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
19 mars 2009 à 15:19
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
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
19 mars 2009 à 16:22
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
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
20 mars 2009 à 13:39
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
Newenda Messages postés 75 Date d'inscription lundi 1 décembre 2008 Statut Membre Dernière intervention 26 avril 2021 24
20 mars 2009 à 15:26
??? Undefined function or variable "pbug".

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



aie...
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
20 mars 2009 à 16:19
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
Newenda Messages postés 75 Date d'inscription lundi 1 décembre 2008 Statut Membre Dernière intervention 26 avril 2021 24
23 mars 2009 à 09:11
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
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
23 mars 2009 à 10:56
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
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
23 mars 2009 à 14:22
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
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
23 mars 2009 à 15:27
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
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
23 mars 2009 à 16:38
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
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
23 mars 2009 à 16:47
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
Newenda Messages postés 75 Date d'inscription lundi 1 décembre 2008 Statut Membre Dernière intervention 26 avril 2021 24
25 mars 2009 à 16:58
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
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
25 mars 2009 à 18:14
Salut

La syntaxe est celle-ci de toute façon :
A=rdir('D:\Travail\DOSSIER_TEST\HUGE_TEST\**\*.txt'­);
Ciao
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
26 mars 2009 à 12:44
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