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 :

[Intermédiaire] Beau challenge pour la lecture d'un .txt complexe


Sujet :

MATLAB

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 4
    Points : 2
    Points
    2
    Par défaut [Intermédiaire] Beau challenge pour la lecture d'un .txt complexe
    Bonjour tout le monde

    Je me nomme Adrien et je suis étudiant en 3eme année d'école d'ingé. Là, je suis en Espagne pour un stage (désolé du coup si je me loupe dans les accents).

    Je suis en train faire une simulation sous Matlab et Simulink d'un robot.
    Ma version de logiciel est la 7.9.0.529 (R2009b)

    Grâce à des .m, je génère mon modèle Simulink avec des variables que l'utilisateur donne via une interface graphique.

    Cette interface est composée du nom du modèle simulé, du nombre de partie du robot et du temps de simulation.
    L'utilisateur appuie alors sur un bouton et une matrice apparait (toujours dans l'interface) afin que l'utilisateur entre les paramètres de chaque partie.

    Toutes ces données sont alors stockées dans un fichier texte...
    On se retrouve ainsi avec un fichier du type

    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
     
    systeme1 | Nb_partie(=10) | Tps_simu
    Tramo_1 | Tramo_2 | Tramo_3 | Tramo_4 | Tramo_5 | Tramo_6 | Tramo_7 | Tramo_8 | Tramo_9 | Tramo_10 | 
    Longitud: | 0   0   0   0   0   0   0   0   0   0 | 
    Masa:     | 0  0  0  0  0  0  0  0  0  0 | 
    Diametro: | 0  0  0  0  0  0  0  0  0  0 | 
    AlphaYp:  | 0  0  0  0  0  0  0  0  0  0 | 
    AlphaZp:  | 0  0  0  0  0  0  0  0  0  0 | 
    AlphaY:   | 0  0  0  0  0  0  0  0  0  0 | 
    AlphaZ:   | 0  0  0  0  0  0  0  0  0  0 | 
     
    systeme2 | Nb_partie(=15) | Tps_simu
    Tramo_1 | Tramo_2 | Tramo_3 | Tramo_4 | Tramo_5 | Tramo_6 | Tramo_7 | Tramo_8 | Tramo_9 | Tramo_10 | Tramo_11 | Tramo_12 | Tramo_13 | Tramo_14 | Tramo_15 | 
    Longitud: | 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 | 
    Masa:     | 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 | 
    Diametro: | 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 | 
    AlphaYp:  | 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 | 
    AlphaZp:  | 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 | 
    AlphaY:   | 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 | 
    AlphaZ:   | 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 |
    La matrice de données numériques est la retranscription d'une matrice générée par le GUI.(voir le code à la fin du post)

    et c'est là qu'arrive le problème !!!



    Le but du jeu est de pouvoir récupérer les données correspondantes à un système.
    L'utilisateur demande de simuler le systeme2, il faut donc lire le texte, repérer le systeme 2 parmi tous les autres, puis récupérer les 7 paramètres pour chaque trame de ce systeme.

    J'ai cherché partout, essayer les fonctions textscan, textread, importdata et d'autres, mais je n'arrive pas à sortir quelque chose de propre.
    En effet, le nombre de trame pour chaque système peut varier impliquant des erreurs de dimension pour des fonctions.

    Le plus souvent, je me retrouve soit avec une structure illogique soit avec une cellule 1x1, comprenant une cellule Nx1 avec '|' comme délimiteur.

    J'espère que la description est assez complète pour avoir un peu d'aide, sinon, je vous donnerais les infos demandées bien entendu


    Merci beaucoup !!!!!!!!


    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
     
    function Button_Guardar_Callback(hObject, eventdata, handles)
    % hObject    handle to Button_Guardar (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
     
    tabledata =get(handles.Table,'data');    % on récupère les valeurs de Table du gui
     
    In_Numero=getappdata(0,'In_Numero'); %on récupère la valeur du nombre de trame de l'editbox stockée
    In_Nombre=getappdata(0,'In_Nombre'); %nom du systeme
    In_Tiempo=getappdata(0,'In_Tiempo'); %tps de simu
    N_Tramo=getappdata(0,'N_Tramo'); %Nom de la trame du type "Tramo_i"
     
    fid=fopen('Sistemas.txt','a+');
     
    fprintf(fid,'%s',  [In_Nombre{1},' | ', In_Numero,' | ', In_Tiempo] );
    %fprintf(fid,['\n\t\t','  | ']);
    fprintf(fid,'\n');
    for k=1:str2num(In_Numero) %Gui_Tramo_N
        fprintf(fid,'%s',[N_Tramo{k},' | ']);
    end;
     
        fprintf(fid,'\n%s',['Longitud:', ' | ' ,[num2str(tabledata(1,:)),' | ']]);
        fprintf(fid,'\n%s',['Masa:', '     | ' ,[num2str(tabledata(2,:)),' | ']]);
        fprintf(fid,'\n%s',['Diametro: ', '| ' ,[num2str(tabledata(3,:)),' | ']]);
        fprintf(fid,'\n%s',['AlphaYp: ', ' | ' ,[num2str(tabledata(4,:)),' | ']]);
        fprintf(fid,'\n%s',['AlphaZp: ', ' | ' ,[num2str(tabledata(5,:)),' | ']]);
        fprintf(fid,'\n%s',['AlphaY: ', '  | ' ,[num2str(tabledata(6,:)),' | ']]);
        fprintf(fid,'\n%s',['AlphaZ: ', '  | ' ,[num2str(tabledata(7,:)),' | ']]);
        fprintf(fid,'\n\n');
     
     
    assignin('base','TableData',tabledata); % on met ds le workspace le tableau de données
     
    clear all;
    close all;

  2. #2
    Nouveau membre du Club
    Inscrit en
    Février 2009
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 57
    Points : 33
    Points
    33
    Par défaut
    Bonjour,

    je ne suis pas au top avec matlab, mais j'ai eu des besoins similaires aux tiens...
    J'ai utilisé la fonction importdata, ou uiimport quand importdata ne convenait pas.
    Ensuite, tu as une partie "textdata", donc tu fais une recherche de caractères pour retrouver ce qui m'intéresse dans le fichier texte. Ca pourrait te permettre d'aller chercher le numéro de système, 'systeme1' par exemple...

    Pour moi ça donne ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    param = textscan(X,'%s%d','delimiter','\t');
    test = strfind(param{1},'ce que tu cherches');
    if isempty(test{1})
    else ....
    C'est pas super précis comme réponse mais c'est la démarche que j'ai faite et qui fonctionne super bien, quelque soit le nombre de lignes, de colonnes, de paramètres...

    En espérant que ça t'aide un peu...
    Bon courage.

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

    Étant donné que c'est toi qui contrôles la forme du fichier texte à lire, pourquoi ne pas tout simplement enlever le caractère '|' à l'écriture?

    Comme te l'a dit kariboubou, la fonction importdata fonctionnerait alors très bien.
    Pour repérer un système, tu peux renseigner la propriété headerline au fur et à mesure de la lecture de la taille des blocs de systèmes.

    Remarque:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    fid=fopen('Sistemas.txt','a+t');
    
    % écriture 
    
    fclose(fid);
    Dernière modification par Invité ; 23/05/2012 à 16h59.

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci pour vos réponses !

    @kariboubou
    Ce procédé me servira sans doute pour la suite. Merci pour l'idée !

    @WinJerome
    J'ai modifié mon .txt comme suivant
    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
     
    systeme
    Tramo_1 Tramo_2 Tramo_3 Tramo_4 Tramo_5 Tramo_6 Tramo_7 Tramo_8 Tramo_9 Tramo_10
    Longitud:  0  0  0  0  0  0  0  0  0  0
    Masa:      0  0  0  0  0  0  0  0  0  0
    Diametro:  0  0  0  0  0  0  0  0  0  0
    AlphaYp:   0  0  0  0  0  0  0  0  0  0
    AlphaZp:   0  0  0  0  0  0  0  0  0  0
    AlphaY:    0  0  0  0  0  0  0  0  0  0
    AlphaZ:    0  0  0  0  0  0  0  0  0  0
     
    systeme2
    Tramo_1 Tramo_2 Tramo_3 Tramo_4 Tramo_5 Tramo_6 Tramo_7 Tramo_8 Tramo_9 Tramo_10 Tramo_11 Tramo_12
    Longitud:  0  0  0  0  0  0  0  0  0  0  0  0
    Masa:      0  0  0  0  0  0  0  0  0  0  0  0
    Diametro:  0  0  0  0  0  0  0  0  0  0  0  0
    AlphaYp:   0  0  0  0  0  0  0  0  0  0  0  0
    AlphaZp:   0  0  0  0  0  0  0  0  0  0  0  0
    AlphaY:    0  0  0  0  0  0  0  0  0  0  0  0
    AlphaZ:    0  0  0  0  0  0  0  0  0  0  0  0
    Cependant, Quand j'utilise importdata, il ne voit que le système1.
    Le procédé marche mieux en effet, même si je vais devoir faire un traitement de ma ligne possédant le nom des trame. J'aurais aimé pouvoir mettre un nom de trame dans une case lors de la lecture.

    Si je comprends l'idée évoquée, il faudrait que j'incrémente la propriété headerline grâce à la recherche du système pour activer l'importdata ?
    J'ai essayé ceci mais le système1 passe comme un en-tête alors qu'il faudrait qu'il soit totalement ignorée...

    je continue à chercher avec vos idées. Merci encore

  5. #5
    Nouveau membre du Club
    Inscrit en
    Février 2009
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 57
    Points : 33
    Points
    33
    Par défaut
    Si tu utilises uiimport tu peux palier au probleme puisque c'est toi qui indique en quelques sorte le numéro de ligne du header. C'est comme ça que j'ai palier au même problème que celui que tu rentre avec impordata. J'avoue que je n'ai pour le moment pas chercher à résoudre ce problème, mais une solution automatique m'intéresserait beaucoup! Donc si tu trouves une solutions efficace je suis preneur!

    Concernant le recherche de caractères, c'est un peu pénible à écrire, mais une fois que c'est fait c'est vraiment royal!

  6. #6
    Invité
    Invité(e)
    Par défaut
    Tu peux t'inspirer de cette discussion avec une condition plutôt de la forme systeme_lu ~= systeme_cherche

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    J'ai regardé la solution proposée mais je me perds totalement !!
    tout est un peu brouillon là dans ma tête

    Je suis donc preneur de tout bout de code pouvant m'aider à clarifier tout ça

    Pour le moment, les fonctions, j'arrive à générer une structure 1x1 contenant nx1 cellules. Dans chaque cellule, une ligne du texte est écrite.

    Je pourrais travailler sur cette base pour reconnaitre le système cherché puis faire du traitement de string pour chaque cellule et sortir mes infos..
    C'est une technique un peu barbare..j'espérais qu'il y aurait des idées pouvant nuancer cela...

    @kariboubou: si je trouve, je te ferai signe ^^

  8. #8
    Invité
    Invité(e)
    Par défaut
    Une autre solution avec texscan:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    fid = fopen('Sistemas.txt','rt');
    S = textscan(fid,'%s','delimiter','\n');
    fclose(fid);
    S = S{1};
    Index = find(cellfun(@isempty,S));
    S{Index+1} % noms des systèmes

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    J'ai finalement résolu mon problème. Je mets la solution pour ceux que ça intéresserait !!

    Merci encore pour l'aide !!

    Forme du texte
    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
     
    systeme1
    10
    1
    Longitud
    0 0 0 0 0 10 0 0 0 1000
    Masa
    0 0 0 0 0 0 0 0 0 0
    Diametro
    0 0 0 500 0 0 0 0 0 0
    AlphaYp
    0 0 0 0 0 0 0 0 0 0
    AlphaZp
    0 0 0 0 0 30 0 0 0 0
    AlphaY
    0 0 0 0 0 0 0 0 0 0
    AlphaZ
    0 0 20 0 0 0 0 0 0 0
     
    systeme2
    4
    200
    Longitud
    100 100 100 100
    Masa
    1 1 1 1
    Diametro
    20 20 20 20
    AlphaYp
    0 0 0 0
    AlphaZp
    0 30 -30 0
    AlphaY
    0 0 0 0
    AlphaZ
    90 30 -30 0
    Code mis en place
    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
     
     
    fid = fopen('Sistemas.txt','rt');
    S = textscan(fid,'%s','delimiter','\n');
    fclose(fid);
     
    S = S{1};
    Index = find(cellfun(@isempty,S));
     
    clear Test;
     
    for k=1:size(Index)
        if strcmp(S{Index(k)+1}, Nom_systeme_cherché)==1
            for i=(Index(k)+1) :(Index(k)+1)+16
                Data.(['line',num2str(i-(Index(k)))])={S{i}};
     
            end;
        end;
    end;
     
    clear k;clear i;clear fid;clear ans;clear S;clear Index; 
    clear Nombre_Buscado;
     
     
    N_Tramo_Total=str2num(Data.line2{1});
    Time=str2num(Data.line3{1});
     
    Longitud=strread(Data.line5{1});
    Masa=strread(Data.line7{1});
    Diametro=strread(Data.line9{1});
    AlphaYp=strread(Data.line11{1});
    AlphaZp=strread(Data.line13{1});
    AlphaY=strread(Data.line15{1});
    AlphaZ=strread(Data.line17{1});
    Ensuite, pour récupérer, par exemple, le diamètre du système 1 de la trame 4, il suffit juste de faire var=Diametro(4);

    Chaque bloc possède le même nombre de lignes correspondant aux paramètres définissant une trame.
    J'ai donc joué sur les indices pour que, peu importe le système recherché, la longueur, le diamètre, etc se retrouvent toujours sur la même ligne de ma structure.
    Ensuite, je lis chaque ligne pour récupérer un tableau de valeurs numériques grâce à strread.

  10. #10
    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
    Citation Envoyé par Winjerome Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Index = find(cellfun(@isempty,S));
    S{Index+1} % noms des systèmes
    Ou encore :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Index = strncmp(S,'systeme',7);
    S{Index} % noms des systèmes
    Sinon, pourquoi faire un seul fichier ?

    Ne serait-il pas plus simple de faire un fichier par "système" ?

    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
    function Button_Guardar_Callback(hObject, eventdata, handles)
    % hObject    handle to Button_Guardar (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    tabledata =get(handles.Table,'data');    % on récupère les valeurs de Table du gui
    
    In_Numero=getappdata(0,'In_Numero'); %on récupère la valeur du nombre de trame de l'editbox stockée
    In_Nombre=getappdata(0,'In_Nombre'); %nom du systeme
    In_Tiempo=getappdata(0,'In_Tiempo'); %tps de simu
    N_Tramo=getappdata(0,'N_Tramo'); %Nom de la trame du type "Tramo_i"
    
    if isappdata(0,'nsystem')
       n = getappdata(0,'nsystem')+1;
    else n = 1;
    end
    setappdata(0,'nsystem',n);
    
    filename = sprintf('Sistemas%d.txt',n);
    
    fid=fopen('filename','wt');
    
    ...
    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)

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

Discussions similaires

  1. Les freewares pour la lecture de fichiers multimédias
    Par Michaël dans le forum Autres Logiciels
    Réponses: 42
    Dernier message: 01/01/2020, 18h56
  2. Aide pour la lecture d'un .txt
    Par Julienlali dans le forum MATLAB
    Réponses: 1
    Dernier message: 18/03/2011, 08h47
  3. Recherche astuce pour la lecture d'un txt
    Par tibofo dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 12/12/2008, 14h33
  4. [EMF] Java pour la lecture d'EMF
    Par deepfred dans le forum Eclipse Platform
    Réponses: 2
    Dernier message: 22/04/2005, 15h39

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