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 :

Ouvrir et effectuer des calculs sur un fichier txt [Débutant]


Sujet :

MATLAB

  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur d'études environnement
    Inscrit en
    Octobre 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur d'études environnement

    Informations forums :
    Inscription : Octobre 2014
    Messages : 10
    Points : 3
    Points
    3
    Par défaut Ouvrir et effectuer des calculs sur un fichier txt
    Bonjour à tous,

    Je suis débutant sur Matlab et je bloque pour importer et manipuler des fichiers txt.

    Je dispose d'environ 400 fichiers textes comportant chacun 6 colonnes et un nombre variable de lignes, dont la première est un en-tête en texte (voir exemple joint), le séparateur est une tabulation. Je dois effectuer un calcul simple de coefficients à partir des données pour ensuite afficher un graphique pour chacun des fichiers.
    Pour l'instant, j'aimerais juste taper un premier code "exemple" permettant d'importer un de ces fichiers pour ensuite calculer mes coefs et tracer mon graph.
    Le problème est que je n'arrive même pas à importer et afficher mon txt dans matlab. J'ai essayé plusieurs fonctions comme "dataset", "importdat", "fopen", mais je ne sais laquelle peut fonctionner...

    Avec importdata, code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab1 = importdata('K0120010.txt')
    J'obtiens comme réponse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    tab1 = 
     
              data: [1826x6 double]
          textdata: {1x6 cell}
        colheaders: {1x6 cell}
    Mais comment visualiser ce tableau dans Matlab ? "Disp" ne marche pas...


    Merci d'avance pour votre aide.
    Fichiers attachés Fichiers attachés

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Août 2014
    Messages
    1 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2014
    Messages : 1 295
    Points : 2 385
    Points
    2 385
    Par défaut
    Bonjour,

    Quand tu effectues ici un importdata, Matlab te crée une variable de type structure (du fait qu'il y ait à la fois du texte et des nombres dans ton fichier texte). Tu peux ici accéder à tes données en écrivant dans ton script ou dans ta fenêtre de commande Si tu t'intéresses uniquement aux données dans tes fichiers textes, il peut être intéressant d'affecter ces données dans une variable de type matrice, mat_data = tab1.data, ça peut éventuellement rendre le script un peu plus lisible.
    Si vous cherchez des réponses sur ce forum il faudra avant tout expliquer clairement votre problème et exposer la démarche que vous avez entreprise pour le résoudre. Fournissez une base de travail et de réflexion à vos interlocuteurs!

  3. #3
    Candidat au Club
    Homme Profil pro
    Ingénieur d'études environnement
    Inscrit en
    Octobre 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur d'études environnement

    Informations forums :
    Inscription : Octobre 2014
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Bonjour Gooby et merci pour ta réactivité,

    Finalement j'ai utilisé la fonction readtable indiquée dans l'aide Matlab pour créer une table à partir de mon fichier en créant une variable spécifiant le format des données de chaque colonne. Mais ma fonction ne marche toujours pas, voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    formatSpec = '%{dd/MM/yyyy}D%d%d%d%d%f'
     
    table = readtable('K0010010.txt','Delimiter','\t','Format',formatSpec)
    Et l'erreur suivante :

    Undefined function 'readtable' for input arguments of type
    'char'.
    
    Error in exemple1 (line 3)
    table =
    readtable('K0010010.txt','Delimiter','\t','Format',formatSpec) 
    Je suppose que c'est un problème avec les en-têtes mais je ne trouve pas la solution...

  4. #4
    Modérateur

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Août 2014
    Messages
    1 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2014
    Messages : 1 295
    Points : 2 385
    Points
    2 385
    Par défaut
    Je n'ai tout bonnement jamais utilisé cette fonction, mais je dirais d'un premier abord que 'Format', et 'FormatSpec' sont des options à spécifier et non à laisser sous cette forme.

    Mea culpa pour le format, formatspec, je n'avais pas fait attention au morceau de code que tu avais mis au dessus.
    Si vous cherchez des réponses sur ce forum il faudra avant tout expliquer clairement votre problème et exposer la démarche que vous avez entreprise pour le résoudre. Fournissez une base de travail et de réflexion à vos interlocuteurs!

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

    Cette fonction a fait son apparition avec la version MATLAB 2013b en même temps que le type table. Vu le message d'erreur, il est probable que tu travailles sur une version antérieure.

  6. #6
    Candidat au Club
    Homme Profil pro
    Ingénieur d'études environnement
    Inscrit en
    Octobre 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur d'études environnement

    Informations forums :
    Inscription : Octobre 2014
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    C'est bon j'ai réussi à sortir un code en utilisant tout simplement le menu "file/import data" et en lui demandant de m'écrire le code correspondant à la manip.

    En effet Winjerome, je travaille sur la version 2011b donc tout s'explique...

    J'ai maintenant une autre question :

    Mon fichier comporte ces variables (exemple d'une mesure faite le 01/01/1969) :

    Date Année Mois Jour Qls Qm3s
    01/01/1969 1969 1 1 xxx xxxx

    Je souhaiterais faire la moyenne de tous les Qm3s mesurés au mois de janvier pour toutes les années de mesures, c'est-à-dire la moyenne de toutes mes valeurs de la colonne "Qm3s" pour lesquelles la colonne "Mois" a une valeur de 1, mais je ne vois pas du tout comment faire...

    Encore merci pour votre aide !!

  7. #7
    Modérateur

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Août 2014
    Messages
    1 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2014
    Messages : 1 295
    Points : 2 385
    Points
    2 385
    Par défaut
    Il faut que tu trouves les indices de ligne correspondant au mois que tu cherches.

    Prenons un exemple: tu cherches toutes les lignes dont le mois correspond à Janvier

    La colonne 3 représente les mois. Le mois de janvier est le mois numéro 1.
    Si ton tableau de données s'appelle datas tu peux alors effectuer la commande suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    indices = find(datas(:,3) == 1);
    indices comportera alors toutes les lignes correspondant au moins de Janvier.

    Tu peux alors faire la moyenne qui t'intéresse en effectuant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maMoyenne = mean(datas(indices,6))
    Si vous cherchez des réponses sur ce forum il faudra avant tout expliquer clairement votre problème et exposer la démarche que vous avez entreprise pour le résoudre. Fournissez une base de travail et de réflexion à vos interlocuteurs!

  8. #8
    Candidat au Club
    Homme Profil pro
    Ingénieur d'études environnement
    Inscrit en
    Octobre 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur d'études environnement

    Informations forums :
    Inscription : Octobre 2014
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Ok merci beaucoup je vais faire ça !

  9. #9
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 882
    Points : 3 432
    Points
    3 432
    Par défaut
    Citation Envoyé par Gooby Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    indices = find(datas(:,3) == 1);
    indices comportera alors toutes les lignes correspondant au moins de Janvier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maMoyenne = mean(datas(indices,6))
    juste une précision : ici l'appel à la fonction find n'est pas utile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    indices = datas(:,3) == 1;

  10. #10
    Candidat au Club
    Homme Profil pro
    Ingénieur d'études environnement
    Inscrit en
    Octobre 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur d'études environnement

    Informations forums :
    Inscription : Octobre 2014
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Ok merci Fab, j'essaierai d'épurer plus tard !

    Nouvelle interrogation :

    J'ai calculé un coefficient mensuel que j'aimerais maintenant afficher sur un graphe avec en X : le mois et en Y : le coef.

    J'ai fait une boucle for pour calculer mes coefs mensuels mais je n'arrive pas à les afficher sur un graphe, mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    % Calcul coef et traçage graphe
     
    Mann = mean(A.Qm3s)
     
     for i = 1:12
     
              Mmens = mean(A.Qm3s(find(A.Mois==i)))
              Coef = Mmens/Mann
              plot(i,Coef)
     end
    Un graphe vide s'affiche... Des idées ?

    Merci à tous en tout cas pour votre réactivité et efficacité !

  11. #11
    Modérateur

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Août 2014
    Messages
    1 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2014
    Messages : 1 295
    Points : 2 385
    Points
    2 385
    Par défaut
    Bonjour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    % Calcul coef et traçage graphe
     
    Mann = mean(A.Qm3s)
     
    for i = 1:12
     
        Mmens = mean(A.Qm3s(find(A.Mois==i)))
        Coef = Mmens/Mann
        plot(i,Coef)
    end
    Je ne suis pas un expert comme tu as pu le voir ci dessus mais je ne pense pas que ce soit la bonne façon de procéder pour tracer ton graphique


    Voici quelque chose qui devrait mieux marcher:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    % Calcul coef et traçage graphe
     
    Mann = mean(A.Qm3s)
     
    for i = 1:12
        Mmens(i) = mean(A.Qm3s(find(A.Mois==i)))
        Coef(i) = Mmens(i)/Mann
    end
     
    figure; %Ouvre une nouvelle figure;
    hold on; box on; grid on; %Place un quadrillage sur ta figure, le hold lui va servir à maintenir ta courbe même si tu en affiches une seconde par la suite
    plot(1:12,Coef,'*-b')
    Si tu veux des explications sur le pourquoi du comment n'hésites pas.

    PS: merci le_fab pour la précision, je ne sais pas pourquoi j'ai toujours tendance à placer un find, ça a un effet... rassurant
    Si vous cherchez des réponses sur ce forum il faudra avant tout expliquer clairement votre problème et exposer la démarche que vous avez entreprise pour le résoudre. Fournissez une base de travail et de réflexion à vos interlocuteurs!

  12. #12
    Candidat au Club
    Homme Profil pro
    Ingénieur d'études environnement
    Inscrit en
    Octobre 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur d'études environnement

    Informations forums :
    Inscription : Octobre 2014
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Ok merci je vais essayer tout de suite, juste une question : pourquoi le '*-b' ?

  13. #13
    Modérateur

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Août 2014
    Messages
    1 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2014
    Messages : 1 295
    Points : 2 385
    Points
    2 385
    Par défaut
    C'est surtout "cosmétique", le b pour la couleur bleu de ton graphe, le '*' pour que les points soient représentés par des étoiles et le '-' pour que les points soient reliés entre eux par des lignes.

    NB: Dans le code que j'ai écrit j'ai oublié la majuscule à Coef dans le plot.
    Si vous cherchez des réponses sur ce forum il faudra avant tout expliquer clairement votre problème et exposer la démarche que vous avez entreprise pour le résoudre. Fournissez une base de travail et de réflexion à vos interlocuteurs!

  14. #14
    Candidat au Club
    Homme Profil pro
    Ingénieur d'études environnement
    Inscrit en
    Octobre 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur d'études environnement

    Informations forums :
    Inscription : Octobre 2014
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Ok par contre les points ne sont pas reliés entre eux...

    En fait il a fallu que j'intègre le plot dans ma boucle, sinon il ne me faisait un tracer qu'avec la dernière valeur de Coef, et que je remplace le 1:12 par i sinon il me traçais à chaque fois 12 points avec la même valeur de Coef.

    Mon nouveau code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Mann = mean(A.Qm3s)
    figure 
    hold on; box on; grid on;
     
     for i = 1:12
              Mmens = mean(A.Qm3s(find(A.Mois==i)));
              Coef = Mmens/Mann
              plot(i,Coef,'*-b')                    
     end
    En tout cas merci pour ton aide, les points sont bien là où il faut, reste plus qu'à les relier !

  15. #15
    Invité
    Invité(e)
    Par défaut
    La solution t'a été donnée par Gooby dans le deuxième code de ce message.

    À consulter aussi : la FAQ Comment relier des points dans une boucle ?

  16. #16
    Candidat au Club
    Homme Profil pro
    Ingénieur d'études environnement
    Inscrit en
    Octobre 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur d'études environnement

    Informations forums :
    Inscription : Octobre 2014
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Oui j'ai bien vu merci mais le '+-b' semble sans effet, j'ai effectivement mes marqueurs en croix bleues mais ils ne sont pas reliés.

  17. #17
    Invité
    Invité(e)
    Par défaut
    Je te conseille de relire les deux éléments donnés, consciencieusement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD12] Maj des calculs sur les fichiers de données
    Par karim15 dans le forum WinDev
    Réponses: 7
    Dernier message: 09/11/2012, 10h31
  2. Réponses: 2
    Dernier message: 18/12/2010, 19h42
  3. Modifications des droits sur un fichier txt
    Par zooffy dans le forum ASP.NET
    Réponses: 10
    Dernier message: 10/06/2010, 11h26
  4. Effectuer des calculs sur Access 07
    Par aldébaranjr dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 25/05/2009, 10h08
  5. Effectuer des opérations sur plusieurs fichiers txt
    Par Jim la truite dans le forum MATLAB
    Réponses: 4
    Dernier message: 11/08/2008, 23h18

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