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 une ligne d'un txt après une certaine chaine de caractère


Sujet :

MATLAB

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 16
    Points : 16
    Points
    16
    Par défaut lire une ligne d'un txt après une certaine chaine de caractère
    Bonjour,

    J'ai un fichier configuration dans lequel j'ai mes paramètres en .txt.
    Nom : Capture.PNG
Affichages : 178
Taille : 5,0 Ko

    Je le lis avec :
    fid = fopen('param.txt','r');
    text = textscan(fid,'%s','Delimiter','');
    text = text{1};
    fclose(fid);

    Donc dans matlab j'ai :
    Nom : Capture1.PNG
Affichages : 144
Taille : 29,3 Ko

    J'aimerai avoir accès à toute la ligne après les "=" pour créer mes variables.
    Pour les nombre j'ai réussi avec par exemple :
    integrationTime=regexp(text,'integrationTime=+(\d*)','tokens');
    integrationTime=[integrationTime{:}];
    integrationTime=str2double([integrationTime{:}]);

    Mais pour la liste de caractère, je n'arrive pas à lire la ligne entière... par exemple pour lire la ligne après "vernis=" et donc avoir dans ma variable vernis la chaine "haut-indice & bas-indice & ASM" (que je splitterai plus tard grâce aux "&").
    Sachant que je n'aurai pas forcément 3 type de vernis mais il pourra s'en ajouter (idem pour les indices de vernis).

    Merci beaucoup,

  2. #2
    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
    salut

    il y a la fonction split qui est pas mal si tu es en 2016b ou plus !

  3. #3
    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
    Comme ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fid = fopen('param.txt','r');
    text = textscan(fid,'%s','Delimiter',{'\n' '='});
    fclose(fid);
    Ce qui donne :
    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
    >> text{1}
     
    ans = 
     
        'integrationTime'
        '50'
        'Nb_scans'
        '10'
        'box_width'
        '10'
        ''
        'vernis'
        'haut-indice & bas-indice & ASM'
        'indice'
        '1.58 & 1.46 & 1.51'
        'epaisseur_bas'
        '1.6 & 3.5'
        'epaisseur_haut'
        '3.5 & 4.5'
    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)

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 16
    Points : 16
    Points
    16
    Par défaut
    Oui... mais pas tout à fait.
    Je vais essayer d'être plus clair.
    Je développe des soft et donc je créer des exécutables Matlab.
    Pour donner une valeur à ma variable "integrationTime" j'ai un fichier texte dans lequel j'écris cette valeur (ici 50) après le nom "integrationTime=".
    Le soucis c'est que tout le monde modifie ce .txt et mon "integrationTime=50" peut se retrouver aussi bien en ligne 5 qu'en ligne 32.

    Donc je cherche à pouvoir retrouver la ligne où est situé mon integrationTime et me donner la valeur après le "=" (donc le 50 dans ce cas). --> j'utilise regexp qui fonctionne très bien pour des chiffres (mais je ne sais pas l'utiliser pour lire toute une ligne de texte après ce "nomVariable=")

    Pour les autres variables c'est pareil. Par exemple ma variable "vernis" sera une liste avec {"haut-indice", "bas-indice", "ASM"}. Je dois donc lire la ligne où se trouve "vernis", puis lire l’entièreté de la ligne après le "vernis=" pour attribuer les valeurs à ma variable (j'utiliserai après la fonction split avec le delimiter "&" pour les séparer dans une liste).
    Ce que je cherche à faire c'est juste lire la ligne après le "vernis=". Car il faut savoir qu'on pourra rajouter par la suite d'autres vernis et ma liste deviendra par exemple "haut-indice & bas-indice & ASM & XXX1 & XXX2".

    J'espère avoir été plus clair...

    Merci beaucoup





    Citation Envoyé par Jerome Briot Voir le message
    Comme ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fid = fopen('param.txt','r');
    text = textscan(fid,'%s','Delimiter',{'\n' '='});
    fclose(fid);
    Ce qui donne :
    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
    >> text{1}
     
    ans = 
     
        'integrationTime'
        '50'
        'Nb_scans'
        '10'
        'box_width'
        '10'
        ''
        'vernis'
        'haut-indice & bas-indice & ASM'
        'indice'
        '1.58 & 1.46 & 1.51'
        'epaisseur_bas'
        '1.6 & 3.5'
        'epaisseur_haut'
        '3.5 & 4.5'

  5. #5
    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
    Essaie ceci :
    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
    fid = fopen('param.txt','r');
    text = textscan(fid,'%s','Delimiter',{'\n' '='});
    fclose(fid);
     
    idx = find(startsWith(text{1}, 'integrationTime'));
    integrationTime = str2double(text{1}{idx+1});
     
    idx = find(startsWith(text{1}, 'Nb_scans'));
    Nb_scans = str2double(text{1}{idx+1});
     
    idx = find(startsWith(text{1}, 'box_width'));
    box_width = str2double(text{1}{idx+1});
     
    idx = find(startsWith(text{1}, 'vernis'));
    vernis = textscan(text{1}{idx+1}, '%s', 'delimiter', '&');
     
    idx = find(startsWith(text{1}, 'indice'));
    indice = textscan(text{1}{idx+1}, '%f', 'delimiter', '&');
     
    idx = find(startsWith(text{1}, 'epaisseur_bas'));
    epaisseur_bas = textscan(text{1}{idx+1}, '%f', 'delimiter', '&');
     
    idx = find(startsWith(text{1}, 'epaisseur_haut'));
    epaisseur_haut = textscan(text{1}{idx+1}, '%f', 'delimiter', '&');
    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)

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 16
    Points : 16
    Points
    16
    Par défaut
    Oh Yes !!! Je ne connaissais pas cette fonction "startsWith" !
    Merci beaucoup


    Citation Envoyé par Jerome Briot Voir le message
    Essaie ceci :
    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
    fid = fopen('param.txt','r');
    text = textscan(fid,'%s','Delimiter',{'\n' '='});
    fclose(fid);
     
    idx = find(startsWith(text{1}, 'integrationTime'));
    integrationTime = str2double(text{1}{idx+1});
     
    idx = find(startsWith(text{1}, 'Nb_scans'));
    Nb_scans = str2double(text{1}{idx+1});
     
    idx = find(startsWith(text{1}, 'box_width'));
    box_width = str2double(text{1}{idx+1});
     
    idx = find(startsWith(text{1}, 'vernis'));
    vernis = textscan(text{1}{idx+1}, '%s', 'delimiter', '&');
     
    idx = find(startsWith(text{1}, 'indice'));
    indice = textscan(text{1}{idx+1}, '%f', 'delimiter', '&');
     
    idx = find(startsWith(text{1}, 'epaisseur_bas'));
    epaisseur_bas = textscan(text{1}{idx+1}, '%f', 'delimiter', '&');
     
    idx = find(startsWith(text{1}, 'epaisseur_haut'));
    epaisseur_haut = textscan(text{1}{idx+1}, '%f', 'delimiter', '&');

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

Discussions similaires

  1. [Batch] Lire une certaine partie d'un fichier texte
    Par Alwaysin dans le forum Scripts/Batch
    Réponses: 6
    Dernier message: 29/03/2012, 19h51
  2. Réponses: 7
    Dernier message: 30/06/2011, 00h40
  3. [Batch] Lire une certaine ligne d'un fichier ini
    Par ptilemare dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 02/08/2010, 08h11
  4. Réponses: 4
    Dernier message: 07/12/2006, 11h01
  5. Réponses: 3
    Dernier message: 12/10/2006, 13h23

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