IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MATLAB Discussion :

Nom de fichiers et importdata


Sujet :

MATLAB

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 76
    Points : 58
    Points
    58
    Par défaut Nom de fichiers et importdata
    Bonjour,

    Etant donné que j'ai énormément de fichiers à importer, j'ai créé un petit programme qui stocke dans une matrice de cellules toutes les adresses des fichiers que je veux rapatrier. Le problème est que quand je lance le run la commande "importdata" ne reconnait pas le nom de mon fichier si j'écris quelquechose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    A=importdata(fname{1,1}, ' ', 4);
    (avec la valeur de fname{1,1} l'adresse de mon fichier.

    Quelqu'un a-t-il une solution????

    Merci bcp!

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Quelle erreur obtiens-tu?
    Peux-tu nous montrer ce que contient fname{1,1} ?

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 76
    Points : 58
    Points
    58
    Par défaut
    Bonjour,

    Chaque cellule contient l'adresse d'un des fichiers que je veux importer. En fait j'ai 8 fichiers par jour sur un nombre de jours à déterminer par l'opérateur (au moins 10) à rapatrier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    disp(fname{2,2}) = 'C:\..\HDIAGGLOB22+20100101+W02.txt'
    L'erreur obtenue est "Unable to open file" du coup j'ai essayé plusieurs autres commandes mais aucune n'a marché. En fait il faudrait forcer matlab à comprendre que le nom ou l'adresse du fichier qu'il attend dans l'import data correspond à la valeur de la cellule que je lui indique.. Mais je vois pas comment faire. J'ai essayé importdata(disp(fname{1,1},'',4) mais bien sur "too many arguments"..

    Après peut etre que ma méthode est laborieuse je reste ouvert à toute autre propositions!

  4. #4
    Invité
    Invité(e)
    Par défaut
    As-tu vérifié que le fichier existe bien?
    Que retourne
    À tout hazard, est-ce que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    importdata(fname{1,1}{1},'',4)
    marche?

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 76
    Points : 58
    Points
    58
    Par défaut


    Tu as raison il manquait juste {1} ..

    Merci beaucoup pour ton aide

    A bientot

  6. #6
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 163
    Points
    53 163
    Par défaut
    Citation Envoyé par Winjerome Voir le message
    Je trouve personnellement ce tableau de cellules bien compliqué...

    Pourquoi ne pas simplement avoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fname{1,1} = 'C:\..\HDIAGGLOB22+20100101+W02.txt'
    et non pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fname{1,1}{1} = 'C:\..\HDIAGGLOB22+20100101+W02.txt'
    Pourrais-tu nous montrer le code où tu crées la variable fname ?
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 76
    Points : 58
    Points
    58
    Par défaut
    Est-ce que tu peux m'expliquer la différence entre les deux?
    Parceque j'ai déclaré

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fname{1,1} = 'C:\..\HDIAGGLOB22+20100101+W02.txt'
    et non pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fname{1,1}{1} = 'C:\..\HDIAGGLOB22+20100101+W02.txt'
    et il n'y a pas de problème lors du run pour créer ces cellules. Par contre dans importdata si j'écris seulement fname{1,1} j'ai un message d'erreur "Unable to open file".. Problème réglé si je tape

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    importdata(fname{1,1}{1},'',4)

    J'avoue que je suis perdu là.. Pourquoi est ce que sans {1} dans importdata ca ne marche pas?

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 76
    Points : 58
    Points
    58
    Par défaut
    D'ailleurs j'ai une autre question (tant qu'à faire )

    Comme je l'ai dit j'ai 8 fichiers (de W02 à W09) à importer par jour, sur plusieurs jours. Mon importdata se trouve donc dans une boucle sur i, le nombre de jours désiré. A partir de là je voudrais donc que les noms de mes fichiers importés dans le workspace soit expicite du genre

    date+W0*

    Comment je pourrais écrire ca sur matlab ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for i=1:nb_jours
    
    'date_i+W02' ?? = importdata(...);
    ..
    ..
    ..
    'date_i+W09' ??=importdata(...)
    
    end

    J'espère que ma question est claire.. Ca me parait pas évident évident là... J'ai regardé la FAQ se rapportant à l'incrémentation des noms de fichiers j'en ai compris le principe mais j'ai du mal à l'appliquer à mon cas

  9. #9
    Invité
    Invité(e)
    Par défaut
    Je rejoins Dut pour ce qui est de la création des fname, pourrai-tu nous montrer la partie de code correspondante?
    Car au vu des résultats, j'ai plutôt tendance à penser que tu as fait quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fname{1,1} = {'C:\..\HDIAGGLOB22+20100101+W02.txt'}
    Ensuite pour répondre à ton autre question, déjà évite le '+' dans le nom de ta variable , et retire les guillements:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i=1:nb_jours
        date_i_W{i} = importdata(...);
    end

  10. #10
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 76
    Points : 58
    Points
    58
    Par défaut
    Voici le code pour la création des fname (pour un seul des fichiers sur les 8) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for i= 1:nb_j
        file(i)=input('Quelles sont les dates? (format YYYYMMDD)  ');
        filename2=['C:\Users\Guillaume\Documents\matlab stage\HDIAGGLOB22+' int2str(file(i)) '+W02.txt'];
        fname{1,i}={filename2};
        W02_file{i}=importdata(fname{1,i}{1}, ' ', 4);
    end
    En ce qui concerne ma deuxième question j'aimerais que le nom change a chaque fois en fonction de la date qui correspond à "file" pour donner qch du genre "20100101_W02" "20100101_W08" etc... J'ai bien tenté comme vous pouvez le voir ci-dessus mais ce n'est pas très concluant.. Petite idée?

  11. #11
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 163
    Points
    53 163
    Par défaut
    Je ne suis pas sûr de tout comprendre mais le code ci-dessus se simplifie en :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for i= 1:nb_j
        f = input('Quelles sont les dates? (format YYYYMMDD)  ','s');
        fname{i} = ['C:\Users\Guillaume\Documents\matlab stage\HDIAGGLOB22+' f '+W02.txt'];
        W02_file{i} = importdata(fname{i}, ' ', 4);
    end
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  12. #12
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 76
    Points : 58
    Points
    58
    Par défaut
    Oui ton code fonctionne aussi c'est vrai que je me suis un peu compliqué la tâche..

    importdata est vraiment une fonction puissante le problème c'est qu'elle n'est pas très flexible.. Est-ce que j'ai un moyen d'obliger la fonction importdata à mettre dans un tableau aussi bien des chiffres que des caractères?? Parce que là il me crée deux tableaux à l'import: data avec mes numéros et textdata avec mes caractères.. J'ai essayé plusieurs choses dont fullfile mais rien n'y fait. argh
    Pour mieux comprendre, mes données sont sous la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     2931  1
    Aura-MLS                             
    201001010000  00000 -32.62   20.49  7
     14677.  1
    [ O3]  0.87862E-07  0.25611E-06  0.16825E-06
     10000.  1
    [ O3]  0.16696E-06  0.84277E-06  0.67581E-06
      6812.  1
    [ O3]  0.71407E-06  0.18679E-05  0.11538E-05
      4641.  1
    [ O3]  0.21635E-05  0.40769E-05  0.19134E-05
      3162.  1
    [ O3]  0.40701E-05  0.63845E-05  0.23144E-05
      2154.  1
    [ O3]  0.69746E-05  0.52141E-05 -0.17605E-05
      1467.  1
    [ O3]  0.90825E-05  0.98523E-05  0.76981E-06
    Impossible d'obtenir un joli tableau )

    Merci de ton aide!

  13. #13
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Une solution avec textread:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for i= 1:nb_j
        f = input('Quelles sont les dates? (format YYYYMMDD)  ','s');
        fname{i} = ['C:\Users\Guillaume\Documents\matlab stage\HDIAGGLOB22+' f '+W02.txt'];
        T = textread(fname{i},'%s','delimiter','\n');
        W02_file{i}.header = {T{1:3}}';
        W02_file{i}.datas = [textscan(char(T(4:2:end))','%d %d')  textscan(char(T(5:2:end))','[ %2c] %f %f %f')];
    end

  14. #14
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 76
    Points : 58
    Points
    58
    Par défaut
    Merci beaucoup beaucoup c'est presque ça.. Il y a juste un petit défaut c'est que le bout de données que je vous ai montré se répète 2931 fois avec des valeurs numériques qui changent à chaque fois... Du coup voici ce que l'on obtient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     2931  1
    Aura-MLS                
    201001010000 00000 -32.62   20.49  7
     14677.  1
    [ O3]  0.87862E-07  0.25611E-06  0.16825E-06
     10000.  1
    [ O3]  0.16696E-06  0.84277E-06  0.67581E-06
      6812.  1
    [ O3]  0.71407E-06  0.18679E-05  0.11538E-05
      4641.  1
    [ O3]  0.21635E-05  0.40769E-05  0.19134E-05
      3162.  1
    [ O3]  0.40701E-05  0.63845E-05  0.23144E-05
      2154.  1
    [ O3]  0.69746E-05  0.52141E-05 -0.17605E-05
      1467.  1
    [ O3]  0.90825E-05  0.98523E-05  0.76981E-06
    201001010000  00000 -34.10   20.08  6
     10000.  1
    [ O3]  0.21950E-06  0.40033E-06  0.18083E-06
      6812.  1
    [ O3]  0.80614E-06  0.15478E-05  0.74164E-06
      4641.  1
    [ O3]  0.23181E-05  0.36278E-05  0.13096E-05
      3162.  1
    [ O3]  0.39343E-05  0.47219E-05  0.78762E-06
      2154.  1
    [ O3]  0.66684E-05  0.59391E-05 -0.72929E-06
      1467.  1
    [ O3]  0.89324E-05  0.72383E-05 -0.16941E-05
    
    etc...
    du coup chaque ligne où on a la date +l'heure (ex :201001010000) vient s'intercaler et on n'a plus notre texte de la forme

    et le scan du texte s'arrête


    Vous voyez?

    En tout cas merci pour le bout de code j'aurais mis biiieeeennnn longtemps à le trouver tout seul...

  15. #15
    Invité
    Invité(e)
    Par défaut
    Evidemment ça change un peu la donne:
    En considérant que le '201001010000' est constant pour toutes les dates: (à changer sinon)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    for i= 1:nb_j
        f = input('Quelles sont les dates? (format YYYYMMDD)  ','s');
        fname{i} = ['C:\Users\Guillaume\Documents\matlab stage\HDIAGGLOB22+' f '+W02.txt'];
        T = textread(fname{i},'%s','delimiter','\n');
        W02_file{i}.header = {T{1:2}}';
        Idx = find(cellfun(@(x) ~isempty(strfind(x,'201001010000')),T));
        Idx = [Idx ;length(T)];
        W02_file{i}.dates = T(Idx);
        for j = 1:length(Idx)-1
            T1 = T(Idx(j)+1:Idx(j+1)-1);
            W02_file{i}.datas(j,1:6) = [textscan(char(T1(1:2:end))','%d %d')  textscan(char(T1(2:2:end))','[ %2c] %f %f %f')];
        end
    end

  16. #16
    Invité
    Invité(e)
    Par défaut
    Dans ce cas, il est possible d'utiliser ce dernier numéro de la ligne:
    On procède de la manière suivante:
    -On lit la 3ème ligne, on en retire le chiffre 7
    -On lit alors les 2*7 lignes suivantes que l'on stocke
    -On lit la ligne de date suivante et on en retire le dernier chiffre
    - etc...

  17. #17
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 76
    Points : 58
    Points
    58
    Par défaut
    Alors alors.. En fait mon fichier correspond à un jour de données, sur ce jour on a fait 2931 mesures à un t différent. Cet instant t est défini par l'heure à la minuté près..Donc des fois on a plusieurs mesures dans la même minute et des fois on aura aucune mesure pendant 5 min..

    Donc je ne pense pas que ca va être gérable. A moins de ne le faire juste trouver les lignes commencant par 20100101**** vu qu'on est sur la même journée..

    Après je t'avoue que ton code dépasse largement mes connaissances je vais donc essayer de comprendre tout ca et je te dis si ca marche! Encore une fois merci mille fois

  18. #18
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 76
    Points : 58
    Points
    58
    Par défaut
    Ok!! Merci pour tout je vais m'y atteler ...

  19. #19
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 76
    Points : 58
    Points
    58
    Par défaut
    Peux-tu m'expliquer le @x?

  20. #20
    Invité
    Invité(e)
    Par défaut
    Donc je ne pense pas que ca va être gérable. A moins de ne le faire juste trouver les lignes commencant par 20100101**** vu qu'on est sur la même journée..
    C'est tout à fait faisable, tu lis la 3ème ligne et tu crées une variable chaine contenant les 8 premiers caractères que tu mettras dans le strfind à la place de '201001010000'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Date = char(T{3});
    Critere= Date(1:8)
    Dernière modification par Invité ; 17/03/2011 à 16h48.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Comment récupérer le nom du fichier sans l'extension ?
    Par altahir007 dans le forum Langage
    Réponses: 16
    Dernier message: 13/11/2009, 13h20
  2. Récupérer le nom du fichier spool correspondant à un job
    Par chtiot dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 23/02/2004, 20h28
  3. Réponses: 2
    Dernier message: 29/01/2004, 11h05
  4. Réponses: 4
    Dernier message: 10/10/2003, 18h04
  5. nom de fichier et variables d'environnement
    Par joebarthib dans le forum Langage
    Réponses: 2
    Dernier message: 18/07/2002, 15h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo