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 :

[textscan] %f en évitant string


Sujet :

MATLAB

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 14
    Points : 6
    Points
    6
    Par défaut [textscan] %f en évitant string
    Bonjour,

    J'utilise une fonction récupérant toutes les données d'un fichier texte à la suite, dans un format numérique.

    J'avais dans un premier temps écrit la fonction suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function [m]=ouverture_fichier(fichier)
    f=fopen(fichier);
    a=textscan(f,'%s');
    fclose(f);
    m=a{:};
    Elle fonctionne mais tout ce qui se trouve dans m est en string donc je dois faire un str2double devant toutes les opérations de mes autres programmes ce qui n'est pas très pratique.

    J'ai essayé en remplaçant %s par %f mais cela ne fonctionne pas car dès que des données non numériques sont rencontrées la lecture s'arrête.

    J'ai ensuite trouvé cette solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function [m]=ouverture_fichier_2(fichier)
    f=fopen(fichier);
    a=textscan(f,'%f','treatAsEmpty',{'$TITLE','=','$SUBTITLE=','$LABEL','OUTPUT'....etc....});
    fclose(f);
    m=a{:};
    Cela fonctionne bien et plus vite, toutes les chaines de caractères sont remplacées par NaN ce qui me convient. Mais j'ai une vingtaine de mots à éviter ce qui n'est pas très pratique, de plus, si un nouveau mot apparaît dans un nouveau fichier cela ne fonctionnera pas.

    1) Avez vous une solution pour que textscan (avec %f) évite toutes les données de type non numérique ?

    2) J'en profite pour demander aussi si il est possible d'éviter la ligne m=a{:}; en faisant en sorte que textscan remplisse directement sous forme de vecteur et non de cell contenant ce vecteur.

    Merci d'avance pour vos réponses.

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

    1. Sous quelle format se présente ton fichier ? Quelles sont les données à récupérer ?
    2. Non la sortie de la fonction textscan est toujours sous forme de tableau de cellules. Il y a l'option 'CollectOutput' qui peut permettre de rassembler des colonnes de même type, mais c'est tout.
      Attention à cette syntaxe m=a{:}; : m ne contiendra que les éléments de la première cellules de a.
    Dernière modification par Invité ; 17/09/2014 à 22h15.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Merci pour la réponse.

    1. Il s'agit d'un fichier .txt qui est assez complexe avec des lignes de tailles différentes. Donc je récupère toutes les données à la suite dans un vecteur, peu importe la disposition des lignes.
    2. Comme je récupère tout à la suite il n'y a qu'une seule cellule dans a donc ça ne pose pas de problème.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Sylvain_F Voir le message
    peu importe la disposition des lignes.
    Justement non, si tu veux que l'on t'aide il faut connaître un minimum comment sont constituées tes lignes.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Ok.

    Difficile de montrer tout le fichier car il fait plusieurs Go mais il ressemble à ça, avec des variantes par endroits :

    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
        994557       S      1.514103E-03      0.000000E+00      0.000000E+00
    -CONT-                  0.000000E+00      0.000000E+00      0.000000E+00
    -CONT-                  1.697277E+02      0.000000E+00      0.000000E+00
    -CONT-                  0.000000E+00      0.000000E+00      0.000000E+00
        994572       S      4.569275E-03      0.000000E+00      0.000000E+00
    -CONT-                  0.000000E+00      0.000000E+00      0.000000E+00
    -CONT-                  3.559317E+02      0.000000E+00      0.000000E+00
    -CONT-                  0.000000E+00      0.000000E+00      0.000000E+00
    $TITLE   =                                                                      
    $SUBTITLE=                                                                      
    $LABEL   = analyse                                                    
    $VELOCITY
    $MAGNITUDE-PHASE OUTPUT
    $SUBCASE ID =           1
    $FREQUENCY =   0.5000000E+02
        696753       G      5.744174E-17      8.488986E-17      1.328624E-03
    -CONT-                  4.109419E-03      1.136248E-02      4.578936E-16
    -CONT-                  1.808419E+02      8.941885E+01      8.893187E+01
    -CONT-                  8.988342E+01      8.925800E+01      1.430070E+02
        696935       G      7.928236E-17      4.677205E-17      2.675068E-03
    -CONT-                  7.730329E-03      3.059407E-04      4.580566E-16
    -CONT-                  2.280000E+02      2.198350E+02      8.960825E+01
    -CONT-                  9.064516E+01      2.493298E+02      1.787209E+02
        696989       G      9.055206E-17      3.949215E-17      2.321873E-03
    -CONT-                  2.477000E-03      4.847005E-03      5.868312E-16
    -CONT-                  2.216863E+02      1.721119E+02      8.936962E+01
    -CONT-                  9.225796E+01      9.059760E+01      8.918661E+01
        697022       G      9.789958E-17      3.568868E-17      2.329695E-03
    -CONT-                  2.959313E-03      1.134074E-02      1.810612E-16
    -CONT-                  2.265501E+02      1.502685E+02      8.949208E+01
    -CONT-                  2.673885E+02      9.016070E+01      1.492536E+02

  6. #6
    Invité
    Invité(e)
    Par défaut
    Et tu veux récupérer les trois colonnes de données de droite c'est ça ?

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Oui, et aussi la fréquence.
    Il y a plein de blocs de données comme ça, mais ils ne sont pas toujours identiques selon le fichier d'entrée. En fait la fonction récupère le tout et je fais les traitements après dans d'autres programmes. Pour fonctionner avec les autres programmes il faut que la sortie de cette fonction (m) soit un vecteur mais pas une matrice.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Une 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
    data = {};
    fid = fopen(fichier, 'rt');
    while ~feof(fid)
        T = textscan(fid, '%[^$]');
        if ~isempty(T{1})
            data = [data ; textscan(T{1}{1}, '%*20c %n %n %n' ,'CollectOutput', true) ];
        else
            infos = textscan(fid, '$%[^\n]');
            idxFreq = strncmp(infos{1}, 'FREQUENCY', 9);
            if any(idxFreq)
                frequency = textscan(infos{1}{idxFreq}, 'FREQUENCY = %n');
            end
        end
    end
    fclose(fid)
     
    cell2mat(data)
    frequency

Discussions similaires

  1. éliminer un caractere d'un string
    Par no-vice dans le forum Langage
    Réponses: 5
    Dernier message: 09/08/2002, 14h55
  2. String -> long double (_strlold ?)
    Par haypo dans le forum C
    Réponses: 7
    Dernier message: 25/07/2002, 20h22
  3. URGENT: retour de string
    Par Pinggui dans le forum CORBA
    Réponses: 4
    Dernier message: 15/07/2002, 09h47
  4. Réponses: 2
    Dernier message: 05/06/2002, 12h29
  5. String Grid et choix d'une couleur pour une ligne
    Par Gigottine dans le forum C++Builder
    Réponses: 12
    Dernier message: 17/05/2002, 15h23

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