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 :

Extraire des données d'un fichier texte


Sujet :

MATLAB

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 34
    Points : 13
    Points
    13
    Par défaut Extraire des données d'un fichier texte
    Bonjour,

    Voici un fichier txt qui contient les lignes suivantes organisées en plusieurs blocks (3 blocks dans l'exemple):
    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
     
    <objects>
    <object CastShadows="yes" ReceiveShadows="yes" file="noPDB/Cryo_70S.3ds" name="70S_ribosome_0" parent="root" visible="true">
    <position x="-932.390112" y="465.456642" z="-113.6953240"/>
    <rotation w="-0.168567" x="-0.821863" y="0.131280" z="-0.3853420"/>
    <scale x="1.000000" y="1.000000" z="1.000000"/>
    </object>
    <object CastShadows="yes" ReceiveShadows="yes" file="noPDB/Cryo_70S.3ds" name="70S_ribosome_1" parent="root" visible="true">
    <position x="-191.334869" y="-815.207902" z="659.0063650"/>
    <rotation w="-0.990832" x="-0.622205" y="-0.533263" z="0.8630410"/>
    <scale x="1.000000" y="1.000000" z="1.000000"/>
    </object>
    <object CastShadows="yes" ReceiveShadows="yes" file="noPDB/Cryo_70S.3ds" name="70S_ribosome_2" parent="root" visible="true">
    <position x="854.322695" y="645.500598" z="-764.8095280"/>
    <rotation w="0.830886" x="0.836896" y="-0.454449" z="0.7615380"/>
    <scale x="1.000000" y="1.000000" z="1.000000"/>

    Je souhaiterai extraire de chaque bloc les 3 valeurs position x, y et z, les 4 valeurs correspondant à rotation w, x, y et z, et la chaîne de caractères correspondant à name= (ici il faut donc extraire 70S_ribosome_0, 1 et 2).

    Ensuite, je souhaite placer ces valeurs dans une matrice qui contient autant de lignes que de blocks et contenant 8 colonnes : la colonne 1 contient le nom, la colonne 2 contient la position x, etc... jusqu'à la colonne 8 qui contient la rotation z.

    Cela donnera :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    70S_ribosome_0   -932.390112    465.456642    -113.6953240  -0.168567...-0.3853420
    70S_ribosome_1 -191.334869...                                                                                 0.8630410
    70S_ribosome_3   854.322695...                                                 0.7615380
    J'ai lu pas mal de post sur le sujet mais la logique de textscan m'échappe toujours. Grand merci 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 304
    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 304
    Points : 52 882
    Points
    52 882
    Par défaut
    Jette un oeil à cette contribution : Gestion des fichiers XML avec la XML toolbox

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 34
    Points : 13
    Points
    13
    Par défaut
    Merci Dut pour cette réponse.

    J'ai fait des essais avec xml toolbox sans succès, ainsi qu'avec d'autres comme XML2Mat.

    Je préfèrerais utiliser fscanf ou textscan mais leur syntaxe est plutôt difficile.

    Quelqu'un a-t-il une idée ?

  4. #4
    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 damilari Voir le message
    J'ai fait des essais avec xml toolbox sans succès, ainsi qu'avec d'autres comme XML2Mat.
    Pourrais-tu préciser les problèmes que tu as rencontré?

  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 304
    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 304
    Points : 52 882
    Points
    52 882
    Par défaut
    Une solution vite fait :

    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
    X = textread('test.xml','%s','delimiter','\n');
     
    idx = find(strncmp(X,'<object ',8));
     
    idxs = strfind(X(idx),'name="');
    idxe = strfind(X(idx),'" parent="');
     
    for n=1:numel(idx)
       name{n} = X{idx(n)}(idxs{n}+6:idxe{n}-1);
       [position(n,1),position(n,2),position(n,3)] = strread(X{idx(n)+1},'<position x="%f" y="%f" z="%f"/>');  
       [rotation(n,1),rotation(n,2),rotation(n,3),rotation(n,4)] = strread(X{idx(n)+2},'<rotation w="%f" x="%f" y="%f" z="%f"/>');
    end
     
    name
    position
    rotation
    A tester...

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 34
    Points : 13
    Points
    13
    Par défaut Ajout des balises code
    Merci à Dut pour la solution à tester. Je teste et j'en rends compte.

    pour Duf42 :
    Supposons que le contenu de mon fichier xml soit le suivant :

    <object CastShadows="yes" ReceiveShadows="yes" file="noPDB/Cryo_70S.3ds" name="70S_ribosome_0" parent="root" visible="true">
    <position x="-932.390112" y="465.456642" z="-113.6953240"/>
    <rotation w="-0.168567" x="-0.821863" y="0.131280" z="-0.3853420"/>
    <scale x="1.000000" y="1.000000" z="1.000000"/>
    </object>
    Dans Matlab, avec XMLtoolbox, je vais écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    xmlstr = fileread('export.gml')
    J'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    xmlstr =
     
    <object CastShadows="yes" ReceiveShadows="yes" file="noPDB/Cryo_70S.3ds" name="70S_ribosome_0" parent="root" visible="true">
     
    <position x="-932.390112" y="465.456642" z="-113.6953240"/>
     
    <rotation w="-0.168567" x="-0.821863" y="0.131280" z="-0.3853420"/>
     
    <scale x="1.000000" y="1.000000" z="1.000000"/>
     
    </object>
    puis je tape :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    V = xml_parseany( xmlstr )
    J'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    V = 
     
         position: {[1x1 struct]}
         rotation: {[1x1 struct]}
            scale: {[1x1 struct]}
        ATTRIBUTE: [1x1 struct]
    Si je tape V.ATTRIBUTE j'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ans = 
     
           CastShadows: 'yes'
        ReceiveShadows: 'yes'
                  file: 'noPDB/Cryo_70S.3ds'
                  name: '70S_ribosome_0'
                parent: 'root'
               visible: 'true'
    Ensuite je bloque pour obtenir les valeurs concernant la position, etc...

  7. #7
    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 damilari Voir le message
    Ensuite je bloque pour obtenir les valeurs concernant la position, etc...
    Et la commande:
    te renvoie quoi?

  8. #8
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 304
    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 304
    Points : 52 882
    Points
    52 882
    Par défaut
    Vu la nature des variables créées, je te conseille d'aller faire un petit tour par la :

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 34
    Points : 13
    Points
    13
    Par défaut Ajout des balises code
    Pour Duf42 :

    V.position donne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ans = 
     
        [1x1 struct]
    La solution rapide de Dut fonctionne très bien. Je vais regarder chaque ligne pour bien comprendre les instructions.

    Je débute en Matlab donc effectivement un tour du côté de la FAQ ne sera pas une perte de temps.

    Grand merci pour tout l'aide apporté.

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

Discussions similaires

  1. extraire des données depuis un fichier text
    Par marouene_ dans le forum Général Java
    Réponses: 1
    Dernier message: 22/06/2011, 00h23
  2. Extraire des données d'un fichier texte
    Par loliita dans le forum MATLAB
    Réponses: 8
    Dernier message: 23/05/2010, 12h03
  3. Extraire des données d'un fichier texte
    Par fredfaz dans le forum Langage
    Réponses: 2
    Dernier message: 28/02/2009, 06h24
  4. Réponses: 2
    Dernier message: 22/06/2008, 15h41
  5. Extraire des donnés d'un fichier texte
    Par sadsad dans le forum Langage
    Réponses: 2
    Dernier message: 07/02/2006, 15h09

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