Extraire l'extension avec Matlab

julienlali Messages postés 6 Statut Membre -  
khunlun Messages postés 123 Statut Membre -
Bonjour,
Je parcours l'internet depuis deux jours...
J'suis pas doué en prog...
J'arrive toujours pas à mettre en variables les extensions des fichiers de mon dossier.

Je fais la liste avec A=ls :

>> A'

ans =

.
..
QS_XWGRD3_2004133.20063172214
QS_XWGRD3_2004134.20063172214
QS_XWGRD3_2004135.20063172215
QS_XWGRD3_2004136.20063172216

Ce qui m'intéresse c'est de stocker ce qu'il y a après le point.
Bien que le nombre de caractère reste fixe, j'y arrive pas.

%---------------------------------------
monfichier = fopen('liste.txt','w+');
fprintf(monfichier, '%s' , A);
fclose(monfichier);
%---------------------------------------
Il me sort donc un fichier liste.txt avec tous les noms sur la même ligne sans séparation...
J'vous montre un extrait:
. .. QS_XWGRD3_2004133.20063172214QS_XWGRD3_2004134.20063172214

En fait j'arrive à sortir
[E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T] = textread('liste.txt',...
'%29s %29s %29s %29s %29s %29s %29s %29s %29s %29s %29s %29s %29s %29s %29s %29s');

Et alors tous mes noms de fichiers sont associés à une variable, mais selon le dossier, le nombre de fichier devrait varier (de 1:size(ls,1)-2)

Une solution à mon casse-tête ?

11 réponses

  1. khunlun Messages postés 123 Statut Membre 28
     
    Bonjour,

    Je te propose ça :

    path est le dossier contenant les fichiers à traiter.

    fid = fopen('monFichier.txt','w+');
    entities = dir('.');
    for it = 1 : size(entities,1)
    % si l'entité est un dossier, on passe à la suivante
    if entities(it).isdir
    continue;
    end

    currentFile = entities(it).name;
    ind = strfind(currentFile,'.');
    fprintf(fid,'%s\n',currentFile(1,ind(end)+1:end));
    end
    fclose(fid);

    Le fichier monFichier.txt contient toutes les chaines de caractère se trouvant après le point.

    Bonne journée.
    1
  2. khunlun Messages postés 123 Statut Membre 28
     
    Alors pour le traitement, je te propose ça :

    fid = fopen('liste.txt','r');
    while ~feof(fid)

    currentLine = fgetl(fid);

    ** traitement de l'extension **

    end

    fclose(fid);
    1
  3. julienlali Messages postés 6 Statut Membre
     
    Wa !
    Ça c'est super.
    T'as raison, on se retrouve avec une fichier .txt où sont toutes les extensions séparées d'un 'retour'.
    C'est déjà mieux que ce que j'obtenais, c'est-à-dire les noms au complet.

    ************************
    IL ME RESTE UN PROBLÈME !!!
    ************************

    Il me reste à stocker chaque extension ensuite, dans le but de les invoquer plus tard.
    Comme le nombre d'extension varie, et que certain dossiers contiennent 200 fichiers, je ne veux pas garder cette fonction Textread que j'utilise actuellement !

    [E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T] = textread('liste.txt',...
    '%29s %29s %29s %29s %29s %29s %29s %29s %29s %29s %29s %29s %29s %29s %29s %29s');

    Ça, c'est bon quand t'as seulement quelques fichiers, mais pour 200 c'est pas bon ! Surtout que la cardinalité varie....

    Qu'est-ce que je peux faire pour ça !?

    Merci de votre aide encore !!
    0
  4. khunlun Messages postés 123 Statut Membre 28
     
    De rien, ça me fait plaisir ! ^^
    Content d'avoir pu servir.

    Si tu as des questions ou d'autres problèmes, pas de soucis.

    Bonne soirée
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. julienlali Messages postés 6 Statut Membre
     
    Je me suis mal exprimé je pense, mais j'ai fait un update ...
    MERCI !
    0
  7. julienlali Messages postés 6 Statut Membre
     
    Bah t'es extra toi !
    T'es en train de tout résoudre mon truc !

    J'ai jamais suivi de cours Matlab et les concepts exprimés dans le Help sont un peu lourd parfois...

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

    Il me resterait finalement à assigner une variable à chaque extension.

    Parce que quand j'écris:

    X=currentLine

    Il me sort:

    X =
    20063172221

    X =
    20063172222

    X =
    20063172222

    ....
    Ainsi de suite, ne me laissant pour valeur de X que la valeur de la dernière extension.

    Alors si je pouvais avoir genre
    X1= 20063172221
    X2=20063172222
    ...

    Ce serait réglé !

    Merci l'ami ! C'est vraiment apprécié !
    0
  8. khunlun Messages postés 123 Statut Membre 28
     
    Si tu veux juste afficher ce qu'il y a dans le fichier, voila ce que tu peux faire

    it = 1;
    fid = fopen('liste.txt','r');
    while ~feof(fid)
    fprintf(1,'X%d = %s\n',cpt,fgetl(fid));
    it = it+1;
    end
    fclose(fid);

    Ca devrait faire le boulot je pense.

    Bonne chance
    0
  9. julienlali Messages postés 6 Statut Membre
     
    Hahah !
    Exact !

    J'ai changé cpt pour it et c'est top.

    Je fais parcontre face à 2 problèmes:

    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

    Il me donne X1 = 20063172214 pour la première, et c'est parfait.
    Il me donne X = 20063172214 pour la deuxième !
    Il me donne X2 = 20063172215 pour la troisième,
    Il me donne X = 20063172216 pour la quatrième !
    ....

    J'ai donc seulement la moitié des valeurs qui ont Xi d'attribué.

    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

    Et mon autre problème, c'est que je ne peux pas invoquer X1 par la suite !
    C'est comme si il l'avait juste affiché, mais qu'il n'était pas stocké ...

    Super cool merci !
    0
  10. khunlun Messages postés 123 Statut Membre 28
     
    Oui it et pas cpt, au temps pour moi...

    Si tu veux les garder pour les utiliser dans un autre programme, tu as deux solutions.

    La première est de lite le fichier liste dans ce deuxième programme pour avoir les données sous la main.

    Sinon tu peux faire un truc dans le style

    function res = MaFonction(inStr)
    res = ''; % deux simple quote (touche 4) et pas un double (touche 3)
    it = 1;
    fid = fopen(inStr,'r');
    while ~feof(fid)
    res.x(it) = fgetl(fid);
    it = it+1;
    end
    fclose(fid);

    Ensuite, tu l'utilise comme suit

    donnee = MaFonction('liste.txt');

    et tu aura

    donnee.x1
    donnee.x2
    etc

    Si tu veux faire un traitement automatique, tu peux passer par fields(donnee), mais c'est une autre histoire. :)

    Bonne soirée
    0
  11. julienlali Messages postés 6 Statut Membre
     
    Nope, là tu m'as perdu....
    (inStr) c'est un input que t'as défini préalablement ou bien ?
    Il veut rien savoir de compiler function res = MaFonction(inStr) .

    Bon, je reprends.
    Quand je fais ce que tu dis dans le message d'avant, j'obtiens:

    X1 = 20063172214
    X2 = 20063172216
    X3 = 20063172219
    X4 = 20063172220
    X5 = 20063172221
    X6 = 20063172222
    X7 = 20063172223

    C'est-à-dire, exactement la moitié des extensions, en sautant la première, la troisième, la cinquième, ....
    Moi, je les prendrais toutes si je pouvais... (1 à 14)

    Et je dois pouvoir invoquer X1 par la suite, et qu'il me sorte genre:

    >> X1

    X1 =

    20063172214

    Pas évident tout ça, j'suis complètement perdu !
    Merci
    0
  12. khunlun Messages postés 123 Statut Membre 28
     
    Je ne comprend ce que tu veux dire par compiler ?
    Tu as des trucs soulignés en rouge ?

    Tu créé un fichier MaFonction.m contenant les lignes suivantes:

    function res = MaFonction(inStr)
    it = 1;
    fid = fopen(inStr,'r');
    while ~feof(fid)
    str = sprintf('x%d',it);
    res.(str) = fgetl(fid);
    it = it+1;
    end
    fclose(fid);


    Ensuite dans la console tu tapes

    >> donnee=MaFonction('liste.txt');
    >> donnee.x1

    Ca ne marche pas ?
    J'ai testé de mon côté et ça marche

    Si tu as un soucis, je t'enverrai ca par mail

    Bonne journée
    0