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 :

Importer données fichier .dat


Sujet :

MATLAB

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Importer données fichier .dat
    Bonjour,
    Dans le cadre d'un projet, je dois extraire les données d'un fichier .dat contenant les coefficients de chaleur massique de différentes espèces chimiques.

    Le fichier fait 80*74 caractères et se présente comme ceci : (extrait)
    CO                RUS 79C   1O   1    0    0G   200.000  6000.000 1000.        1
     0.30484859E+01 0.13517281E-02-0.48579405E-06 0.78853644E-10-0.46980746E-14    2
    -0.14266117E+05 0.60170977E+01 0.35795335E+01-0.61035369E-03 0.10168143E-05    3
     0.90700586E-09-0.90442449E-12-0.14344086E+05 0.35084093E+01-0.13293628E+05    4
    (La présentation n'est pas terrible, voir PJ)

    Le but est de récupérer :

    1ère ligne : le nom de l'espèce (ds l'exemple CO), la température basse (200.000), la température haute (6000.000) et la température moyenne (1000.)

    Lignes 2, 3 et 4 : les valeurs numériques des 5 coefficients mis bout à bout

    Et de réitérer le processus pour les 18 espèces que compte le fichier.

    J'ai déjà "pondu" une ébauche de code qui me permet de mettre chaque caractère dans une case d'une matrice 72*80 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    fid=fopen('base_small.dat','r'); 
    c=fscanf(fid,'%c'); %seul le type character fonctionne
    n=0;
    for i=1:74
        for j=1:80
            M(i,j)=c(j+n*80);
        end
    n=n+1;
    end
    fclose(fid);
    Le souci ici est que je n'ai absolument aucune idée de comment dire à MATLAB de fusionner les cellules entre-elles pour former un nombre double précision, une chaîne de caractère pour le nom d'espèce et réintégrer tout ça dans une matrice qui me permette d'accéder aux coefficients qui m'intéressent.

    J'ai essayé d'utiliser une autre fonction à la place de fscanf : textscan.
    Elle devrait pouvoir résoudre mon problème de conversion de format.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    fid=fopen('base_small.dat','r'); 
    n0=0;
    for i=1:74
        for j=1:80
            if(i==1+n0*4)
                Q(i,j)=textscan(fid,'%15c %30c %7.3f %7.3f %6.2f %7c');
                n0=n0+1;
            else 
                Q(i,j)=textscan(fid,'%2.8f %2.8f %2.8f %2.8f %2.8f %5c');
            end
        end
    end
    fclose(fid);
    Mon but est de créer une matrice 74*6 avec :
    ## sur les lignes 1, 5, 9, etc. les noms des espèces d'une longueur de 15 caractères, puis 30 caractères inutiles pr la suite, la température haute avec 6 chiffres avant la virgule et 3 derrière, idem pour température basse et moyenne, et enfin 7 autres caractères inutiles
    ## sur les autres lignes (celles où il y a les coefficients) 5 nombres doubles précisions (je ne sais pas trop comment lui faire lire la notation ingénieur) et 5 caractères inutiles.

    Lorsque je lance mon code, voici l'erreur :

    Subscripted assignment dimension mismatch.
    
    Error in ==> tabCoeff2 at 10
                Q(i,j)=textscan(fid,'%15c %30c %7.3f
                %7.3f %6.2f %7c');
    
    Merci d'avance pour toutes vos suggestions.
    Fichiers attachés Fichiers attachés

  2. #2
    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 : 52 882
    Points
    52 882
    Par défaut
    Deux idées similaires :

    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
    fid = fopen('base_small.dat','rt');
     
    n = 0;
     
    while 1
     
        str = fgetl(fid);
     
        if feof(fid)
            break
        elseif ~isempty(str)
            n = n+1;
            S(n).name = deblank(str(1:15));
            S(n).T = sscanf(str(46:end),'%f%f%f%*d');
     
            S(n).M = fscanf(fid,'%f',[6,3]).';
            S(n).M(:,end) = [];
        end   
     
    end
     
    fclose(fid);
    ou
    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
    fid = fopen('base_small.dat','rt');
     
    n = 0;
     
    while 1
     
        str = fgetl(fid);
     
        if feof(fid)
            break
        elseif ~isempty(str)
            n = n+1;
            S.name{n} = deblank(str(1:15));
            S.T(n,:) = sscanf(str(46:end),'%f%f%f%*d');
     
            temp = fscanf(fid,'%f',[6,3]).';
            S.M(3*(n-1)+1:3*n,:) = temp(:,1:end-1);
        end
     
    end
     
    fclose(fid);
    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)

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Merci à toi Dut pour cette réponse si rapide!

    Malheureusement, qd je teste ton code (le 1er par exemple) une erreur apparait :

    ??? Subscript indices must either be real positive integers or logicals.

    Error in ==> testTab at 25
    S(n).M(:,end) = [];
    Mes connaissances en MatLab ne me permettent pas de comprendre en quoi il y a une erreur.
    La même erreur apparait ds le second code dès qu'il y a un "S.X(x)=..."

    D'ailleurs pourrais-tu m'indiquer ce que signifie le S(n).X, ainsi que le '. derrière le fscanf ?

    Excuse mon ignorance. Merci pr ta compassion

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

    Citation Envoyé par JonathanG Voir le message
    Mes connaissances en MatLab ne me permettent pas de comprendre en quoi il y a une erreur.
    D'ailleurs pourrais-tu m'indiquer ce que signifie le S(n).X, ainsi que le '. derrière le fscanf ?
    C'est pour cela que la existe avec une section spéciale Messages d'erreur et avertissements et d'autres qui répondent à certaines questions comme Quelle est la différence entre ' et .' ?

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Autant pour moi, une fois que je re-teste le programme sur mon pc portable, ça fonctionne.

    Merci bcp Dut!

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

Discussions similaires

  1. [Débutant] Extraire données fichier .dat spécial
    Par Yllarius dans le forum MATLAB
    Réponses: 12
    Dernier message: 09/07/2009, 13h47
  2. import données fichier csv
    Par babafredo dans le forum ASP
    Réponses: 10
    Dernier message: 30/10/2008, 07h55
  3. [SQLServer 2K]Importer un fichier .dat
    Par Djangogol dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 25/05/2006, 15h41
  4. Importer un fichier dat dans access ou excel
    Par denisfavre dans le forum Access
    Réponses: 1
    Dernier message: 12/01/2006, 15h39
  5. importer données fichier excel dans bd mysql
    Par Hydre dans le forum Administration
    Réponses: 1
    Dernier message: 05/10/2005, 19h39

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