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 :

Probleme lecture fichier *.dat


Sujet :

MATLAB

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 9
    Points : 1
    Points
    1
    Par défaut Probleme lecture fichier *.dat
    Bonjour à tous,

    Je me permets de vous demander votre aide suite à un problème.
    J'ai plusieurs fichiers *.dat contenant des données radiométriques dans lesquels je souhaiterais extraire certaines informations comme l'inclinaison, la pression, et par la suite obtenir mes longueurs d'onde dans un vecteur avec la luminance correspondante dans un autre afin d'en faire des spectres.

    Voici à quoi ressemble mes fichiers :
    [Spectrum]
    Version            = 1
    IDData             = 42a7_2011-08-09_09-03-25_926_083
    IDDevice           = SAM_8108
    IDDataType         = SPECTRUM
    IDDataTypeSub1     = CALIBRATED
    IDDataTypeSub2     = 
    IDDataTypeSub3     = 
    DateTime           = 2011-08-09 09:03:25
    PositionLatitude   = 0
    PositionLongitude  = 0
    Comment            = A11
    CommentSub1        = 1m
    CommentSub2        = 
    CommentSub3        = 
    IDMethodType       = SAM Control
    MethodName         = SAM_8108
    Mission            = No Mission
    MissionSub         = 1
    RecordType         = 0
    
    [Attributes]
    CalFactor = 1
    IDBasisSpec = 
    IDDataBack = DLAB_2011-03-04_17-21-07_822_758
    IDDataCal = DLAB_2011-03-07_11-21-29_638_062
    IntegrationTime = 128
    P31 = -1
    P31e = 0
    PathLength = +INF
    RAWDynamic = 65535
    Temperature = +NAN
    Unit1 = $01 $01 Wavelength nm
    Unit2 = $03 $06 Intensity mW/(m^2 nm)
    Unit3 = $f0 $06 Error mW/(m^2 nm)
    Unit4 = $f1 $00 Status 
    p999 = 14
    [END] of [Attributes]
    [DATA]
     0 6 0 0
     309.536782951282 +NAN 0 0
     312.828025703063 +NAN 0 0
     316.119527046651 +NAN 0 0
     319.411277962832 1.54579437025474 0 0
     322.703269432392 1.50484844375568 0 0
     325.995492436115 1.56720924970471 0 0
     329.287937954788 1.82500611609189 0 0
     332.580596969197 1.59338067634958 0 0
     335.873460460126 1.6102552176569 0 0
     339.166519408362 1.78880553074779 0 0
     342.459764794689 2.14650350254279 0 0
     345.753187599894 2.48783842310862 0 0
         ...
     938.898613409173 1.47126614772668 0 0
     942.07265637492 0 0 0
     945.245217224091 3.56199112843331 0 0
     948.416286937471 0.597797909871242 0 0
     951.585856495845 5.8620071621845 0 0
     954.75391688 +NAN 0 0
     957.92045907072 +NAN 0 0
     961.085474048792 +NAN 0 0
     964.248952795001 +NAN 0 0
     967.410886290132 +NAN 0 0
     970.571265514972 +NAN 0 0
         ...
     1123.33804128415 +NAN 0 0
     1126.40920749601 +NAN 0 0
     1129.47835945763 +NAN 0 0
    [END] of [DATA]
    [END] of Spectrum
    
    Mes données de longueur d'onde sont comprises dans la section DATA entre 300 et 1200 tandis que ma luminance ou éclairement est la colonne à côté.
    Merci pour toute l'aide que vous pourrez m'apporter.

  2. #2
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Points : 4 661
    Points
    4 661
    Par défaut
    Bonjour,

    As-tu essayer de coder quelquechose?
    Y a-t-il un point particulier qui te bloque?

    Pour lire ton fichier, tu peux utiliser la fonction TEXTSCAN par exemple.

    Duf
    Simulink & Embedded Coder

    Au boulot : Windows 7 , MATLAB r2016b
    A la maison : ArchLinux mais pas MATLAB

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    salut,
    merci pour la réponse
    j'ai réussi à faire çà en lisant le site :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    close all
    fid = fopen('iw_A11_1m.dat','r');
    C = textscan(fid,'%s','delimiter','\n');
    fclose(fid);
    C=C(1);
    maintenant, je voudrais pouvoir extirper facilement des données et notamment les données contenues dans [Data] et les obtenir en 2 colonnes ou 2 vecteurs pour faire un plot

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Pour préciser ma demande, je sais à peu près comment faire pour extraire genre la température en lisant le forum, le plus dur étant de m'en sortir avec les données comprises entre [DATA] et [END]
    car pour un seul même fichier, j'ai 3 mesures à différents intervalles de temps donc je voudrais que mon programme soit capable de m'extraire les data en 2 colonnes une pour les longueurs d'onde et l'autre pour la mesure, il faudrait que cela soit du genre
    mesure 1, mesure 2, mesure x en fonction du nombre de fois où il rencontre le schéma :
    [DATA]
    x y
    x y
    ...
    [END]

    je n'arrive pas à séparer les DATA en 2 colonnes distinctes

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Personne pour m'aider ?
    quand j'utilise cette partie de code, j'ai mon fichier sur une colonne, l'idéal serait de l'avoir sur plusieurs.
    Est-ce qu'on peut demander à matlab de créer une colonne dés qu'il croise un espace par exemple ?

  6. #6
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Points : 4 661
    Points
    4 661
    Par défaut
    Citation Envoyé par Drissou81 Voir le message
    Est-ce qu'on peut demander à matlab de créer une colonne dés qu'il croise un espace par exemple ?
    Oui, par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C = textscan(fid,'%s%s%s');
    Simulink & Embedded Coder

    Au boulot : Windows 7 , MATLAB r2016b
    A la maison : ArchLinux mais pas MATLAB

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    J'avance doucement, j'ai réussi à avoir 3 colonnes
    avec ce petit bout de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    close all
    fid = fopen('iw_A11_1m.dat','r');
    C = textscan(fid,'%s %s %s','headlines',1');
    fclose(fid);
    Ma variable C est de la forme
    {3000,1},{3000,2},{3000,3}
    l'idéal serait de la transformée en C(3000,3) pour me permettre un accès plus rapide aux données
    je ne suis pas à l'aide avec ces transformations.
    Pouvez-vous m'aider ?
    Merci

  8. #8
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Points : 4 661
    Points
    4 661
    Par défaut
    J'avais pas fait attention que c'était des valeurs numériques

    Il vaut mieux utiliser %f que %s pour les valeurs numériques (la conversion est effectuée lors de la lecture).

    Après pour changer le formatage de C, tu peux utiliser:
    Simulink & Embedded Coder

    Au boulot : Windows 7 , MATLAB r2016b
    A la maison : ArchLinux mais pas MATLAB

  9. #9
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Merci pour ton aide mais si j'utilise ta formule
    en fait au lieu d'avoir
    C{1,3} avec
    {3000,1}{3000,1}{3000,1}

    j'obtiens
    C{3,1}

    j'aimerai convertir mes cell array en matrice "normale"

    de plus si je remplace mes %s par %f j'obtiens des cases vides car mon fichier a du texte et des numériques

    edit :

    j'ai trouvé il suffisait d'écrire C = [C{:}];

  10. #10
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Voici où j'en suis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    clear all
    close all
    fid = fopen('iw_A11_1m.dat','r');
    C = textscan(fid,'%s %s %s','headerlines',1);
    C = [C{:}];
    LO = C(49:557,1);
    ED = C(49:557,2);
     
    plot(LO,ED);
    Je souhaiterais enlever les 0 dans ma variable LO car elles ont été rajoutées par matlab lors de la lecture du fichier et mes +nan dans ED ..

    ensuite j'ai un problème quand je veux plotter, j'ai une erreur "not enough imput arguments"

    EDIT :
    si j'essaie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >> plot(ED,LO,'+');
    ??? Error using ==> plot
    Conversion to double from cell is not possible.

  11. #11
    Membre régulier
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 106
    Points : 110
    Points
    110
    Par défaut
    Tu peux essayer cette fonction hdrload.m que tu trouves sur le site www.mathworks.com

  12. #12
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Points : 4 661
    Points
    4 661
    Par défaut
    Pour pouvoir tracer tes données avec PLOT il faut les convertir au format numérique, pour l'instant tu as des chaines de caractères...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    % Suppression des NaN et des 0 dans les vecteurs LO et ED
    nan_idx = strcmp(ED, '+NAN');
    zeros_idx = strcmp(LO, '0');
    LO(nan_idx | zeros_idx) = [];
    ED(nan_idx | zeros_idx) = [];
     
    % Conversion des tableaux de cellules de chaines de caractères en vecteurs numériques
    LO = cellfun(@str2num, LO);
    ED = cellfun(@str2num, ED);
    En espérant ne pas m'être trop trompé...
    Simulink & Embedded Coder

    Au boulot : Windows 7 , MATLAB r2016b
    A la maison : ArchLinux mais pas MATLAB

  13. #13
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Ah j'avais pas vu vos répones du coup, j'ai utilisé str2double(), ce qui m'a effectivement permis de tracer mes données.

    C'était la partie simple de mon programme car maintenant il va me falloir automatiser cela.

    Car si vous voulez dans un fichier (je ne vous ai montré en exemple qu'une partie), j'ai 2 capteurs et plusieurs mesures par capteur.

    Il faudrait en fait que je puisse dire à matlab quelquechose comme ceci :
    if "IDDevice" (ou C(3,1)) = "SAM_8108" (C(3,2)) alors saute 13 lignes et lis "methodname" si methodname = x alors saute 23 lignes et lis (C(i:j,1) = LO
    C(i:j,2) = ED, on continue la lecture du fichier si cette fois methodname = y alors saute 28 lignes, lis les donnée C(i:j,1) = LOlu, C(i:j,2) = LU

    De plus, il faudrait que Ed et Lu soit numéroté en fonction du nombre de mesures car malheureusement, j'ai des fichiers avec 3 mesures, d'autres 5 etc.

    Pour "finir", entre chaque nouvelle entrée de données, il y'a 2 lignes d'espace et à la fin du fichier 3, je voudrais pouvoir mettre une condition de lecture "tant que tu ne trouves pas un espace de 3 lignes vides"

    Toutes vos suggestions seront très appréciées ! Merci pour toute votre aide déjà fournie

  14. #14
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Un petit point sur mon programme :
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    clear all
    close all
     
    % Choix du fichier :
    [FileName,PathName] = uigetfile('*.dat','sélectionnez le fichier texte');
    fid=fopen(fullfile(PathName,FileName),'r');
     
    % Lecture du fichier :
    C = textscan(fid,'%s %s %s','headerlines',1);
     
    % Concaténation :
    C = [C{:}];
     
    % On stocke le nombre de lignes :
    % nLignes = length(C);
     
     
    % capteur = C(18,3);
    % T = strcmp(capteur,'SAM_8108');
     
     
    LO = C(49:557,1);
    ED1 = C(49:557,2);
     
    LOlu = C(616:1124,1);
    LU1 = C(616:1124,2);
     
    ED2 = C(1177:1685,2);
    LU2 = C(1744:2252,2);
     
    ED3 = C(2305:2813,2);
    LU3 = C(2872:3380,2);
     
    % Conversion en double :
    LO = str2double(LO);
    ED1 = str2double(ED1);
    LOlu = str2double(LOlu);
    LU1 = str2double(LU1);
    ED2 = str2double(ED2);
    ED3 = str2double(ED3);
    LU2 = str2double(LU2);
    LU3 = str2double(LU3);
     
    % On prends les valeurs max pour les graphiques
    EDmax = max(ED1);
    LUmax = max(LU3);
     
    % On construit le spectre moyen :
    MoyED = (ED1 + ED2 + ED3)/3;
    MoyLU = (LU1 + LU2 + LU3)/3;
     
    % On représente sur des graphiques :
    subplot(2,2,1), plot(LO,ED1,'b.-',LO,ED2,'g.-',LO,ED3,'r.-');
    axis([300 1000 0 EDmax]);
    subplot(2,2,2), plot(LOlu,LU1,'b.-',LO,LU2,'g.-',LO,LU3,'r.-');
    axis([300 1000 0 LUmax]);
    subplot(2,2,3), plot(LO,MoyED,'k.-');
    axis([300 1000 0 EDmax]);
    subplot(2,2,4), plot(LO,MoyLU,'k.-');
    axis([300 1000 0 LUmax]);

Discussions similaires

  1. [VB]Probleme lecture fichier text et affichage
    Par clochardevobsy dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 10/03/2006, 08h46
  2. Probleme lecture fichier acces sequentiel
    Par ouar dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 23/09/2005, 13h39
  3. Probleme lecture fichier
    Par CaptainChoc dans le forum C++
    Réponses: 5
    Dernier message: 06/03/2005, 10h40
  4. [LG]probleme lecture fichier
    Par yp036871 dans le forum Langage
    Réponses: 2
    Dernier message: 28/01/2004, 19h22
  5. [LG]Probleme lecture fichier file of ....
    Par John_win dans le forum Langage
    Réponses: 11
    Dernier message: 11/11/2003, 18h53

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