Rechercher : dans
Par :

[MATLAB] Nombre de fichiers dans un dossier

Dernière réponse le 27 mar 2009 à 16:22:28 Newenda, le 18 mar 2009 à 12:19:42 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « [MATLAB] Nombre de fichiers dans un dossier » dans :
[Windows] Obtenir la liste des fichiers d'un dossier VoirLister le contenu d'un dossier Voici une astuce simple qui permet de lister le nom des fichiers contenus dans un répertoire. Vous pourrez obtenir en un clic les titres de vos chansons, de vos photos, etc. dans un fichier...
Afficher les extensions et les fichiers cachés sous Windows VoirPour afficher les extensions Solution simple Solution avec le registre Pour afficher les fichiers et les dossiers cachés Pour afficher les fichiers et les dossiers système Pourquoi afficher les extensions ? Lorsque vous ne voyez...
Protéger fichier/dossier par mot de passe VoirReprise d'une contribution de Pgriffet (à enrichir) Sous Win9x/ME Sous XP/2K sans le NTFS Sous XP/2K en NTFS Sous 2K (NTFS ou non) Sous XP/2K (NTFS ou non) XP Home (édition familiale) Vista Sous Win9x/ME Stocker les fichiers...
Télécharger Ant Renamer VoirANT Renamer permet de renommer un grand nombre de fichiers et dossiers en quelques clics. Il ne fait que modifier les noms des fichiers/dossiers : Changement d'extension Remplacement de chaînes de caractères par d'autres Insertion d'une chaîne...
Linux - L'arborescence des fichiers VoirLa hiérarchie des fichiers sous Linux Pour assurer la compatibilité et la portabilité, les systèmes Linux respectent l'unique norme FHS (File Hierarchy Standard). La hiérarchie de base est la suivante : /la racine, elle contient les...
Fichiers et répertoires VoirLes fichiers sous DOS Sur un ordinateur les informations sont stockées dans des fichiers. Lorsqu'on exécute un programme, MS-DOS traite les informations situées dans le fichier et les transmet au système. Sous MS-DOS chaque fichier peut être aussi...

1

Char Snipeur, le 18 mar 2009 à 13:41:44
  • +1

Je pense que les commandes matlab fonctionnent sous windows, de mon souvenir. Salutation ! (il faut bien que vous compreniez que j'ai TOUJ­OURS raison)
Char Snipeur

Répondre à Char Snipeur

2

Newenda, le 18 mar 2009 à 14:42:10

Merci mais reste ma question à 10 euros :)

Répondre à Newenda

3

Char Snipeur, le 18 mar 2009 à 15:30:58

Ne peut tu pas récupérer la sortie de ls ? genre :
A=ls ? Salutation ! (il faut bien que vous compreniez que j'ai TOUJ­OURS raison)
Char Snipeur

Répondre à Char Snipeur

5

Sacabouffe, le 19 mar 2009 à 02:01:03

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 Gare au goriiiiiiiiiille !

Répondre à Sacabouffe

6

Sacabouffe, le 19 mar 2009 à 13:19:25
  • +3

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 Gare au goriiiiiiiiiille !

Répondre à Sacabouffe

7

Newenda, le 19 mar 2009 à 14:26:00

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.

Répondre à Newenda

8

Sacabouffe, le 19 mar 2009 à 15:19: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 :
http://www.mathworks.com/matlabcentral/fileexchange/19550

Bon après-midi Gare au goriiiiiiiiiille !

Répondre à Sacabouffe

9

Sacabouffe, le 19 mar 2009 à 16:22:13

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 Gare au goriiiiiiiiiille !

Répondre à Sacabouffe

10

Newenda, le 20 mar 2009 à 09:45:55
  • +1

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

Répondre à Newenda

11

Sacabouffe, le 20 mar 2009 à 13:39:32

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 ? Gare au goriiiiiiiiiille !

Répondre à Sacabouffe

12

Newenda, le 20 mar 2009 à 15:26:58

??? Undefined function or variable "pbug".

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



aie...

Répondre à Newenda

13

Sacabouffe, le 20 mar 2009 à 16:19:54

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...
Gare au goriiiiiiiiiille !

Répondre à Sacabouffe

14

Newenda, le 23 mar 2009 à 09:11:31

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

Répondre à Newenda

15

Sacabouffe, le 23 mar 2009 à 10:56:37

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 Gare au goriiiiiiiiiille !

Répondre à Sacabouffe

16

Char Snipeur, le 23 mar 2009 à 14:22:50

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. Salutation ! (il faut bien que vous compreniez que j'ai TOUJ­OURS raison)
Char Snipeur

Répondre à Char Snipeur

17

Sacabouffe, le 23 mar 2009 à 15:27:11

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 Gare au goriiiiiiiiiille !

Répondre à Sacabouffe

18

Char Snipeur, le 23 mar 2009 à 16:38:41

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. Salutation ! (il faut bien que vous compreniez que j'ai TOUJ­OURS raison)
Char Snipeur

Répondre à Char Snipeur

19

Sacabouffe, le 23 mar 2009 à 16:47:20

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};
Gare au goriiiiiiiiiille !

Répondre à Sacabouffe

20

Newenda, le 25 mar 2009 à 16:58:05

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

??

Répondre à Newenda