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. #21
    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
    Ca va pas lui poser de problème qu'on lui dise de chercher 20100101 alors qu'on a des lignes qui commencent par 20100101**** ?

  2. #22
    Invité
    Invité(e)
    Par défaut
    Idx = find(cellfun(@(x) ~isempty(strfind(x,'201001010000')),T));
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (@(x) ~isempty(strfind(x,'201001010000'))
    C'est un genre de définition de fonction qui va évaluer le contenu de chaque cellule de la variable T.
    Cela équivaudrai à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    function out = f(x)
    out = ~isempty(strfind(x,'201001010000'))
    Tu as aussi la possibilité d'utiliser une fonction de Matlab ou une que tu as créée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cellfun(@mean,T);
    cellfun(@mafonction,T);

  3. #23
    Invité
    Invité(e)
    Par défaut
    Ca va pas lui poser de problème qu'on lui dise de chercher 20100101 alors qu'on a des lignes qui commencent par 20100101**** ?
    Non aucun problème
    Tu peux essayer rapidement sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    T = '201001010000';
    strfind(T,'20100101')
    T = '201001015678';
    strfind(T,'20100101')
    Dans les deux cas, strfind retourne 1, autrement dit le premier indice du critère cherché dans T

  4. #24
    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
    J'aurais appris un sacré paquet de trucs grâce à vous !

  5. #25
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Idx = find(cellfun(@(x) ~isempty(strfind(x,'critere')),T));
    Donc si j'ai bien compris cette ligne de commande renvoie tous les numéros de lignes où on trouve '*20100101*' ??

    Et les deux lignes suivantes me permettront d'avoir une structure avec toutes les lignes incluant mon critère?

    Et après on fait un textscan sur toutes les lignes comprises entre une des lignes où on a trouvé '20100101' et la ligne suivante où on retrouve notre critère??

    Je changerai juste un peu le code de cette façon :

    car j'ai besoin de stocker également les lignes avec les dates pour mon étude.. Du coup il me faudra aussi ajouter un troisième textscan non??

  6. #26
    Invité
    Invité(e)
    Par défaut
    Attention critere sans guillemets, sinon strfind va chercher 'critère' au lieu de '20100101'
    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
    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}}'; % Stockage des 2 premières lignes
        Date = char(T{3});  % 3ème ligne contenant la date
        Critere= Date(1:8); % Extraction du criète 
        Idx = find(cellfun(@(x) ~isempty(strfind(x,Critere)),T));   % Trouver toutes les ligne contenant le critère
        W02_file{i}.dates = T(Idx); % Stockage des ligne des dates contenant contenant les critères
        Idx = [Idx ;length(T)]; % Ajouter la longueur de T pour pouvoir bien utiliser la boucle for d'après
        for j = 1:length(Idx)-1
            T1 = T(Idx(j)+1:Idx(j+1)-1);  % Données de la date j
            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')];  % Stockage des données
        end
    end
    Et les deux lignes suivantes me permettront d'avoir une structure avec toutes les lignes incluant mon critère?
    Et après on fait un textscan sur toutes les lignes comprises entre une des lignes où on a trouvé '20100101' et la ligne suivante où on retrouve notre critère??

    Je changerai juste un peu le code de cette façon :
    car j'ai besoin de stocker également les lignes avec les dates pour mon étude.. Du coup il me faudra aussi ajouter un troisième textscan non??
    Non je le fait déjà, en fait c'est la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    W02_file{i}.dates = T(Idx);

  7. #27
    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 j'ai vu que tu avais crées une nouvelle matrice .dates mais j'aurais voulu avoir également la ligne corresopndant à la date dans mon fichier .data ..

    Oui j'ai vu ca ('critere') en le testant à l'instant

    Juste une dernière petite question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    W02_file{i}.datas(j,1:6)
    Ca correspond à quoi le 1:6 ?

  8. #28
    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 désolé question idiote

  9. #29
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    W02_file{i}.datas(j,1:6)
    Correspond aux 6 colonnes:
    14677. 1 [ O3] 0.87862E-07 0.25611E-06 0.16825E-06

    [EDIT] J'ai changé mon post précédent en commentant le code

  10. #30
    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 c'est bien ce qu'il me semblait..

    Par contre j'ai un problème sur les lignes impaires. Là où par exemple on a:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     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
    Je retrouve dans le tableau:

    [14677;16812;4641;3162;2154;1467] [110000;1;1;1;1;1] [7x2 char] ...

    Le 1 de la première ligne se retrouve devant le 10000 et considère donc que "110000" est le deuxième caractère de la première ligne. Par contre il réagit bien sur les lignes suivantes.

    Problème de format? J'en ai essayé plusieurs ca n'améliore pas grand chose. Mais c'est bizarre comme problème vu que le formalisme est toujours identique et qu'il se trompe qu'au début non?

  11. #31
    Invité
    Invité(e)
    Par défaut
    Oui en effet, c'est du au fait que la longueur du premier chiffre varie.
    Après moultes essais, je suis arrivé à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for j = 1:length(Idx)-1
        T1 = T(Idx(j)+1:Idx(j+1)-1);  % Données de la date j
        D = cellfun(@(x) str2double(regexp(x,'. ','split')),T1(1:2:end),'UniformOutput',false); % Mise en forme des lignes à 2 chiffres
        W02_file{i}.datas(j,1) = {cell2mat(D)}; % Stockage des lignes à 2 chiffres de la date j
        W02_file{i}.datas(j,2:5) = textscan(char(T1(2:2:end))','[ %2c] %f %f %f');  % Stockage des lignes à 4 chiffres de la date j
    end

  12. #32
    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 pour tout! Ton petit code est parfait

    A bientôt!

  13. #33
    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
    Argh ce code va me faire devenir fou!

    Grâce à Winjerome mon code tourne parfaitement sur mon ordinateur perso (Version R2008b).
    Probème, sur le pc du bureau je n'ai accès "qu'à" la version 2005 qui ne connait pas encore l'option "split" de la fonction regexp..

    Y-a-t-il une librairie qui me permettrait de l'installer? Ou un autre moyen pour mettre en forme la ligne en question qui pose problème??

  14. #34
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 58
    Points : 69
    Points
    69
    Par défaut
    Je n'ai pas suivi toute la discussion mais la fonction split n'est pas dur à encoder.
    Regexp va te donner les indices des caractères que tu cherches et il ne restera plus qu'à faire un boucle sur ces positions pour isoler tes éléments.
    Petit exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    A=['jjj//jjj/jjj/jjj/'];
    pos=regexp(A,'/');
    pos=[0 pos length(A)+1];
    for i =1:length(pos)-1
        G{i}=A(pos(i)+1:pos(i+1)-1);
    end

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

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, 14h20
  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, 21h28
  3. Réponses: 2
    Dernier message: 29/01/2004, 12h05
  4. Réponses: 4
    Dernier message: 10/10/2003, 19h04
  5. nom de fichier et variables d'environnement
    Par joebarthib dans le forum Langage
    Réponses: 2
    Dernier message: 18/07/2002, 16h21

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