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 :

extraite flottant et entier d'une ligne contenant des string [Débutant]


Sujet :

MATLAB

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut extraite flottant et entier d'une ligne contenant des string
    salut tous,

    je vous écris car j'ai un petit soucis, j'ai un fichier texte avec des données de ce type:

    1, 2.5, 52, 5.6, 5.,
    1, 2.5, 52, 5.6, 5., 2.5, 52,
    1, 2.5, 52, 5.6, 5., 2.5, 52, 5.6, 5., 5.6, 5., 2.5, 52, 5.6, 5.,

    et je voudrais lire avec matlab les lignes de ce fichier et extraire nombres contenues dans ces différentes lignes.

    1°) pour la première ligne le traitement de cette ligne devrait me donner 5 composantes : "1" "2.5" "52" "5.6" 5.0"
    la seconde ligne "1" "2.5" "52" "5.6" "5." "2.5" "52"
    etc...

    2°) pour lire les lignes de mon fichiers pas de soucis je fais une boucle avec "fgets" et je stocke la ligne du fichiers dans une variable ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    laLigne=fgets(monFichier)
    3°) par contre j'ai essayé d'utilisé "sscanf" et "texscan" mais je ne suis pas arrivé à faire ce que je souhaite


    ==> pourriez vous me dire comment faire histoire que je résolve ceci une bonne fois pour toute ?

    merci d'avance pour votre aide

  2. #2
    Membre éprouvé
    Avatar de soft001
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2008
    Messages
    409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 409
    Points : 1 146
    Points
    1 146
    Par défaut
    Citation Envoyé par 21did21 Voir le message

    3°) par contre j'ai essayé d'utilisé "sscanf" et "texscan" mais je ne suis pas arrivé à faire ce que je souhaite
    Je pense que vous voulez dire fscanf et non pas sscanf, de même textscan et non pas texscan.

    En ce qui concerne textscan :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fid = fopen('nom_du_fichier.txt');
    A =  textscan(fid,'%s','delimiter','\n','whitespace','');
    fclose(fid);
    Resultat :
    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
    >> A{1}
     
    ans = 
     
        '1, 2.5, 52, 5.6, 5.,'
        '1, 2.5, 52, 5.6, 5., 2.5, 52,'
        '1, 2.5, 52, 5.6, 5., 2.5, 52, 5.6, 5., 5.6, 5., 2.5, 52, 5.6, 5.,'
     
    >> A{1}(1)
     
    ans = 
     
        '1, 2.5, 52, 5.6, 5.,'
     
    >> A{1}(2)
     
    ans = 
     
        '1, 2.5, 52, 5.6, 5., 2.5, 52,'
    Si tu trouves ma réponse utile, n'oublies pas de voter pour ce me message

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

    Citation Envoyé par soft001 Voir le message
    Je pense que vous voulez dire fscanf et non pas sscanf,
    Justement non, 21did21 veut appliquer ces fonctions sur la ligne et non sur le contenu de son fichier.

    @21did21: Déjà oublié cette discussion?

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    merci beaucoup pour vos réponses !

    winjerome:
    merci je m'avoir redonné le lien de cette discussion, en fait je ne le retrouvé pas je me rappelais des fonction à utiliser mais je ne savais plus comment faire avec ces virgules...

    en fait je vais faire un truc plus general et je pense que je vais donc utiliser :
    et comme delimiter je mettrai "," " " "\n" "\t" ";"
    et je pense qu'il sera capable de capter tout les nombres d'une ligne quelque soit le "delimiter" (, ; espace tabulation)

    voici mon nouveau test pour cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    coordNode=textscan(ligne,'%f','delimiter',',','\n','\t',';');
    je m'attendais à ce qu'il me prenne tout les flottants (ou entier) de la ligne
    quelque soit leur nombre et leur delimitations.

    mais j'ai ce messaage d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ??? Error using ==> textscan
    Param/value pairs must come in pairs.
     
    Error in ==> lireText at 23
    coord=textscan(ligne,'%f','delimiter',',','\n','\t',';');
    mais je ne comprends pas trop c'est quoi le blem

    un truc qui marche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    coord=textscan(ligne,'%f','delimiter',',')
    cela ça marche nikel mais par contre j'ai specifié que les delimiteurs ne peuvent être que des virgules alors que dans la réalité ça peut etre des ; des espacces , des tabulations et le code mis au dessus bug et je ne vois pas trop pk, il y a un truc qui m'echappe avec ces delimiteurs

  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 165
    Points
    53 165
    Par défaut
    Citation Envoyé par 21did21 Voir le message
    cela ça marche nikel mais par contre j'ai specifié que les delimiteurs ne peuvent être que des virgules alors que dans la réalité ça peut etre des ; des espacces , des tabulations et le code mis au dessus bug et je ne vois pas trop pk, il y a un truc qui m'echappe avec ces delimiteurs
    Essaie comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    coord = textscan(ligne,'%f','delimiter',',;\t ');
    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 éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    je vais tester, merci beaucoup !

    au fait es ce que matlab beug au bout d'un certain nombre de ligne dans un fichier texte ?

    je vous demande cela car j'ai un fichier texte dans ce genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    aaa
    1 2 3 4 5
    1 2 3 6
    ...
    bbb
    et il y a 35000 lignes de chiffres, je lui est dis de lire ligne par ligne et de stocketr chaque ligne dans une "CELL" du coup je m'attendais à avoir un tableau de type "CELL" qui contient 1x35000 CELL mais il a c'est arreté à 31379

    j'ai verifier la derniere ligne qu'il a lu et c'est bien "bbb" ?

    voyez vous d'où cela vient ?

  7. #7
    Invité
    Invité(e)
    Par défaut
    Quel code utilises-tu pour lire ton fichier?
    Si tu veux lire des caractères, mais mets le format '%f', TEXTSCAN ou SSCANF ne trouvant aucune valeur numérique stopperont.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    EDIT: excusez moi je m'etais trompé de fichier et il y a bien ici 31380 lignes !!!
    désolé du dérangement


    merci pour tous en tout cas
    A+

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    par contre j'ai toujours un probleme...

    voici mon 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
     
    ccc=1;
    while (strcmp(detection{1},motClef)==0) %tant que on a pas
    %detecté mot clef (qui est le premier d'une phrase)
        ligne = fgets(fid2);   %on lit ligne
        detection=textscan(ligne,'%s','delimiter',',');
        coordNodesTemp{ccc,1}=0;
        if(strcmp(detection{1},motClef)==0)
            %mot clef detecté dc pas de numero a copier
        else %on a pas detecté mot clef dc c des coord qu'on doit stocker
           coordNodesTemp{ccc,1}=detection{1}(:)';
           % coordNodes(ccc,:)=coordNodeTemp{ccc}(:)';
        end
        ccc=ccc+1;
    end
    ce que je m'attendais à avoir
    je m'attendais à avoir un tableau de type "CELL" coordNodesTemp{ccc,1}
    qui contiendrais 31380 lignes avec pour chaque ligne 4 nombre (ou plus).

    mais en fait coordNodesTemp{ccc,1} est un tableau qui contient
    31380 ligne avec juste "0" dans chaque ligne...

    comment ce fait il que c'est ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    coordNodesTemp{ccc,1}=detection{1}(:)';
    n'a pas écrasé le zero que j'avais mis précédemment ?

    je vous remercie d'avance

  10. #10
    Invité
    Invité(e)
    Par défaut
    La sortie de la fonction STRCMP est à 1 si les deux chaines sont égales, donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(strcmp(detection{1},motClef)==1)
            %mot clef detecté dc pas de numero a copier

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    oups, merci beaucoup
    je l'avais pas remarqué tellement c'etait gros

    merci beaucoup tous pour votre aide

  12. #12
    Membre éprouvé
    Avatar de ol9245
    Homme Profil pro
    Chercheur
    Inscrit en
    Avril 2007
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Avril 2007
    Messages : 985
    Points : 1 158
    Points
    1 158
    Billets dans le blog
    1
    Par défaut
    Je suis conternt que ton mproblème soit résolu.

    En observant tes questions, je me demande finalement si il t'arrives d'utiliser des méthode de développement pourtant bien rôdées :
    * de débugger tes sources pas à pas ? (tu aurais vu que ton test ne passait pas).
    * d'utiliser des fichiers de test ? (pourquoi tester un code sur 310000 lignes ?)
    * d'utiliser des fonctions de test ? (une fonction de test appelle la fonction à tester de manière répétitive dans des conditiosn d'appel diféretnes et analyses la pertinence des résultats).

    je ne programme pas à plein temps mais régulièrement depuis une trentaine d'annees. Je n'ai jamais cessé d'améliorer ma pratique de l'utilisation des tests en amont et en aval de fonctions que j'écris. Si j'avais eu à traiter ton problème, le code que j'aurais fourni aurait été très différent du tiens.

    Le tiens a l'avantage d'être compact. Le mien aurait été plus long, il aurait contenu plusieurs fonctions et des tests pour chacune. Et je crois que je l'aurais malgré tout livré plus vite et avec plus de confiance qu'il fournisse un résultat prévisible en toutes circonstance.
    "La vraie grandeur se mesure par la liberté que vous donnez aux autres, et non par votre capacité à les contraindre de faire ce que vous voulez." Larry Wall, concepteur de Perl.

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    tu as raison olivier, merci pour cette remarque.
    (je suis autodidacte, je n'ai jamais eu de cours de programmation et c'est pour cela que j'ai des méthodes de travails pas toujours au points )
    ce type de remarque me permet de d'avancer, merci

  14. #14
    Membre éprouvé
    Avatar de ol9245
    Homme Profil pro
    Chercheur
    Inscrit en
    Avril 2007
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Avril 2007
    Messages : 985
    Points : 1 158
    Points
    1 158
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par 21did21 Voir le message
    tu as raison olivier, merci pour cette remarque.
    (je suis autodidacte, je n'ai jamais eu de cours de programmation et c'est pour cela que j'ai des méthodes de travails pas toujours au points )
    ce type de remarque me permet de d'avancer, merci
    Je suis aussi autodidacte.
    99% des gens qui crachent du code sont autodicates.
    Ce n'est pas l'école qui apprend à bien faire les choses : le plaisir à faire quelquechose est la meilleure des écoles.

    Et les cracheurs de code patentés sont soumis à une telle pression de productivité que je ne suis pas si sûr qu'ils soient ceux qui écrivent le code le plus propre (Je connais pas mal de personnes dans le métier qui ne me démentiraient pas!)
    "La vraie grandeur se mesure par la liberté que vous donnez aux autres, et non par votre capacité à les contraindre de faire ce que vous voulez." Larry Wall, concepteur de Perl.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 21/07/2009, 14h08
  2. Réponses: 31
    Dernier message: 20/05/2009, 11h12
  3. Réponses: 2
    Dernier message: 25/04/2009, 20h46
  4. Trouver une ligne contenant des valeurs
    Par John81 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 13/09/2008, 21h44
  5. copier une ligne contenant un mot
    Par newbiedelphi dans le forum Delphi
    Réponses: 2
    Dernier message: 25/07/2006, 11h02

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