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 :

Lire un fichier contenant plusieurs en-têtes


Sujet :

MATLAB

  1. #1
    Membre averti Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Points : 383
    Points
    383
    Par défaut Lire un fichier contenant plusieurs en-têtes
    Bonjour à tous,

    Etant débutant sur Matlab je viens solliciter votre aide afin de réaliser un petit exercice que l'on m'a imposé avec Matlab .

    Voici le fichier que je dois traiter, je ne met pas tout le fichier mais uniquement une partie.

    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
     
    $TITLE   =                                                                     1
    $SUBTITLE=                                                                     2
    $LABEL   = GEN1  SINE Y                                                        3
    $ELEMENT FORCES                                                                4
    $REAL-IMAGINARY OUTPUT                                                         5
    $SUBCASE ID =           2                                                      6
    $ELEMENT TYPE =         102                                                    7
    $FREQUENCY =   0.1000000E+00                                                   8
       2004780              8.460129E+00      3.116020E+01     -4.992444E+00       9
    -CONT-                  3.376748E-02      1.194521E-02      1.147030E-02      10
    -CONT-                 -5.646761E-04     -2.056223E-03      4.725998E-04      11
    -CONT-                 -1.221153E-06     -1.105105E-06     -5.033929E-07      12
       2004781              5.943194E+01     -5.398119E+01      1.936476E+01      13
    -CONT-                 -1.193319E-01     -2.677261E-02     -7.273302E-03      14
    -CONT-                 -3.392528E-03      2.779730E-03     -1.074120E-03      15
    -CONT-                  6.878287E-06      1.821335E-06      3.814517E-07      16
    $TITLE   =                                                                   217
    $SUBTITLE=                                                                   218
    $LABEL   = GEN1  SINE Y                                                      219
    $ELEMENT FORCES                                                              220
    $REAL-IMAGINARY OUTPUT                                                       221
    $SUBCASE ID =           2                                                    222
    $ELEMENT TYPE =         102                                                  223
    $FREQUENCY =   0.1100000E+01                                                 224
       2004780              8.462952E+00      3.117000E+01     -4.994934E+00     225
    -CONT-                  3.377128E-02      1.194957E-02      1.147191E-02     226
    -CONT-                 -6.216708E-03     -2.263430E-02      5.203316E-03     227
    -CONT-                 -1.342868E-05     -1.216769E-05     -5.537162E-06     228
       2004781              5.944707E+01     -5.399313E+01      1.936950E+01     229
    -CONT-                 -1.193590E-01     -2.678180E-02     -7.276726E-03     230
    -CONT-                 -3.734062E-02      3.059453E-02     -1.182347E-02     231
    -CONT-                  7.570247E-05      2.004600E-05      4.199069E-06     232
       2004782              8.337305E+00     -3.896556E+01     -7.908681E-01     233
    -CONT-                 -4.509930E-02     -2.169449E-03     -1.774519E-01     234
    -CONT-                 -4.957831E-03      2.271831E-02      6.993966E-05     235
    -CONT-                  2.199370E-05      3.843620E-06      1.088603E-04     236
       2004783             -6.111114E+01     -5.361680E+01     -2.262869E+01     237
    J'ai toujours le format suivant :

    Une en-tête qui va de $TITLE à $FREQUENCY dans laquelle je dois récupérer la valeur après le $FREQUENCY = <valeur_de_fréquence_à_récupérer>

    Ensuite pour chaque ligne commençant par un ID (exemple : 2004780) je dois récupérer les 3 valeurs qui sont sur la même ligne.

    Enfin lorsque la ligne commence par -CONT- je dois récupérer les 3 valeurs qui suivent mais uniquement pour la deuxième ligne -CONT- rencontré.

    Ma question est la suivante, comment procédez vous pour lire un fichier qui contient plusieurs en-têtes ?

    je sais qu'il existe plusieurs façon pour lire un fichier j'ai étais faire un tour dans la FAQ mais je n'arrive pas à adapter à mon cas.

    Une idée que j'ai eu, mais je sais pas si c'est la meilleure serait de parcourir le fichier et au fur et à mesure créer un fichier par bloc : en-tête + valeurs, pour ensuite traiter chaque fichiers indépendamment.

    Merci d'avance pour votre aide.

  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 : 53 166
    Points
    53 166
    Par défaut
    Voici un début de solution :

    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
    fid = fopen('test.txt', 'r');
     
    k = 0;
    while 1
     
        if feof(fid)
            break;
        end
     
        str = fgetl(fid);
        k = k+1;
     
        if strncmp(str, '$TITLE', 6)
     
            fprintf('$TITLE at line %d\n', k);
     
        elseif strncmp(str, '$FREQUENCY', 10)
     
            fprintf('$FREQUENCY at line %d\n', k);
     
        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
    Membre averti Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Points : 383
    Points
    383
    Par défaut
    Citation Envoyé par Jerome Briot Voir le message
    Voici un début de solution :

    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
    fid = fopen('test.txt', 'r');
     
    k = 0;
    while 1
     
        if feof(fid)
            break;
        end
     
        str = fgetl(fid);
        k = k+1;
     
        if strncmp(str, '$TITLE', 6)
     
            fprintf('$TITLE at line %d\n', k);
     
        elseif strncmp(str, '$FREQUENCY', 10)
     
            fprintf('$FREQUENCY at line %d\n', k);
     
        end
     
    end
     
    fclose(fid);
    Je vais regarder ça, je reviendrai si j'ai des soucis.

    Merci

Discussions similaires

  1. Réponses: 5
    Dernier message: 26/10/2017, 13h28
  2. [Batch] Déplacer un fichier contenant plusieurs espaces
    Par WhitePearl dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 17/07/2016, 08h35
  3. [Débutant] Lire un fichier contenant une matrice
    Par abdousoft dans le forum MATLAB
    Réponses: 5
    Dernier message: 17/05/2011, 12h14
  4. Lire un fichier contenant une matrice
    Par shmeta dans le forum Débuter
    Réponses: 5
    Dernier message: 01/12/2008, 10h57
  5. Réponses: 14
    Dernier message: 28/07/2006, 10h20

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