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 :

récupérer un nombre à un endroit donné d'une chaine de caractères


Sujet :

MATLAB

  1. #1
    Membre régulier
    Inscrit en
    Juillet 2009
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 89
    Points : 85
    Points
    85
    Par défaut récupérer un nombre à un endroit donné d'une chaine de caractères
    Bonjour,

    J'ai un problème qui me paraît être assez simple, mais je n'arrive pas à mettre la main sur les fonctions appropriées pour le résoudre.

    Dans un fichier texte, j'aimerai pouvoir récupérer les valeurs numériques de 2 paramètres.
    Le numéro de la ligne est fixe, donc j'arrive à mettre la chaîne dans une variable avec la commande getl()

    voici un exemple de ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Size 6.000 W X 6.000 H Millimeters, Pixels 500 W X 500 H, Total Hits = 595
    je veux récupérer les dimensions en pixels, donc ici 500 et 500. J'ai pensé à faire un truc qui me trouve l’occurrence du mot "pixels", et donc après je pourrai juste sélectionner le mot suivant. Et c'est précisemment là que je coince... Je me retrouve avec l'indice du mot pixels dans ma string, mais je sais pas quoi en faire.
    Je suis allé voir du côté des fonction "strread" et "strfind", mais j'ai pas trouvé mon bonheur... peut-être que j'ai mal cherché.

    Si quelqu'un peut me donner des pistes de fonctions à utiliser...
    Merci

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

    doc fscanf directement sur l'identifiant du fichier.
    Ou doc sscanf sur tline
    Ou plus facilement avec doc textscan
    Dernière modification par Invité ; 30/08/2011 à 15h42.

  3. #3
    Membre régulier
    Inscrit en
    Juillet 2009
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 89
    Points : 85
    Points
    85
    Par défaut
    Bonjour,

    Merci pour ta réponse. Toutefois, je ne suis pas sur de bien cerner l'utilité des fonctions fscanf et sscanf ici.

    Si j'applique sscanf sur tline, est-ce que je suis obligé de faire une instruction du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    A=sscanf(tline,'%s %d %c %c %d %c %s.... etc
    en décrivant toute ma ligne pour l'exemple?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Size 6.000 W X 6.000 H Millimeters, Pixels 500 W X 500 H, Total Hits = 595
    C'est un peu lourd à mettre en place, et en plus je ne suis pas sur que j'ai toujours les mêmes choses écrites dans ma ligne..

    Donc est-ce qu'il n'y a pas moyen de sélectionner une partie de la chaîne (qui commence à "pixels" ou alors directement au mot suivant, et qui finit après "500 H")?
    Parce que pour cette partie au moins, la syntaxe reste fixe, et là pas de problème pour appliquer un sscanf.

    Merci

  4. #4
    Membre régulier
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 106
    Points : 110
    Points
    110
    Par défaut
    Tu peux utiliser la fonction strfind. Effectivement strfind(tline,'Pixels') te renvoie l'indice de 'P' dans ta chaine de caractère. Tu peux te servir de l'espace comme delimiteur de mot à partir de cette position. Ainsi le mot suivant est celui qui vient après le premier espace.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    indp          = strfind(tline,'Pixels');
    tlinebis      = tline(indp:end);
    Indespaces  = strfind(tlinebis, ' ');
    Nombre1     = tlinebis(Indespaces(1)+1:Indespaces(2)-1);

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Essaie ce code

    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
    function pix=ExtrairePixels(fichier)
     
    fichier_id=fopen(fichier);
    fichier_data=textscan(fichier_id,'%s%s%s','delimiter',',');
    fclose(fichier_id);
     
    pixels=fichier_data{2}{1};
    pixels_num=pixels(8:end);
    for i=1:length(pixels_num)
        if strcmp(pixels_num(i),'X')
            weight_pix=str2double(pixels_num(1:(i-4)));
            height_pix=str2double(pixels_num((i+2):(end-1)));
        end
    end
    pix=[weight_pix,height_pix];
    j’extraie les trois expressions séparées par des virgules et ensuite je prend les nombre séparés par le 'X' ...

  6. #6
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Bonjour,

    une autre solution en utilisant strfind :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    tlinesplit=regexp(tline,' ','split'); % séparation de chaque mot de la chaine de caractère
    % recherche de la position du mot Pixels
    positionPixel = strfind(tlinesplit, 'Pixels');
    k = find(cellfun(@(x) ~isempty(x), positionPixel))
    Avec ton exemple k sera égale à 8, la première valeur sera donc tlinesplit{8+1} et la deuxième tlinesplit{8+4}.
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

Discussions similaires

  1. Réponses: 2
    Dernier message: 25/04/2013, 09h37
  2. Réponses: 3
    Dernier message: 31/08/2011, 15h20
  3. Réponses: 4
    Dernier message: 28/05/2010, 17h11
  4. Réponses: 3
    Dernier message: 01/08/2008, 09h58
  5. extraction d'une donnée d'une chaine de caractères.
    Par LESOLEIL dans le forum Langage
    Réponses: 10
    Dernier message: 20/04/2006, 12h00

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