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 :

Lecture fichier de données numériques avec virgule comme séparateur décimal [Débutant]


Sujet :

MATLAB

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 85
    Points : 34
    Points
    34
    Par défaut Lecture fichier de données numériques avec virgule comme séparateur décimal
    Bonjour à tous,

    Je me permets de vous contacter pour vous demander un petit service sur le logiciel MATLAB.
    Je souhaite ouvrir un fichier .txt avec plus de 10000 lignes sur MATLAB afin d'y tracer des courbes.
    En utilisant la commande fopen, j'obtiens un tableau avec une seule case de remplie alors que je souhaiterai avoir plus 10000 lignes et 7 colonnes exactement.
    Chaque colonne est espacée d'un espace sur le .txt comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    0,2397354800 -0,2040888400 -0,1193534000 0,0311450426 0,0060695523 0,0031582083 0,0022534047
    0,3799203600 -0,0808234900 -0,1639603400 0,0227621280 0,0002822091 0,0003401475 0,0002386205
    Je vous remercie quelque soit votre réponse.

    Cordialement,

    Tom

  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 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 : 52 882
    Points
    52 882
    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)

  3. #3
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 882
    Points : 3 432
    Points
    3 432
    Par défaut
    salut

    je suis pas sur de comprendre
    tu utilise que fopen ??
    si oui le tableau à une case (scalaire soit dit en passant) que tu obtiens est un handle sur ton fichier ouvert
    ensuite il faut utiliser les fonctions fread ou fscanf pour aller prendre le contenu de ton fichier
    inspires toi des exemples dans la doc

    Fabien

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 85
    Points : 34
    Points
    34
    Par défaut
    J'ai utilisé textscan après avoir utilisé fopen.
    J'ai eu avec textscan le même problème que fopen.
    SInon oui j'ai lu la FAQ mais j'ai franchement pas trouvé ce qu'il me fallait, ou du moins j'ai peut être pas tout compris.

  5. #5
    FLB
    FLB est déconnecté
    Modérateur
    Avatar de FLB
    Homme Profil pro
    Ing. Aérospatiale
    Inscrit en
    Juin 2003
    Messages
    770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ing. Aérospatiale
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2003
    Messages : 770
    Points : 1 185
    Points
    1 185
    Par défaut
    Hello,
    tu peux nous montrer ton bout de code avec le textscan? La structure des données tel que tu nous l'a montré ne devrait pas poser de problème de lecture à cette méthode.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 85
    Points : 34
    Points
    34
    Par défaut
    Salut !

    EN fait j'ai juste mis ça comme code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >> fid=fopen('045639 T01 02 1028710.txt','r');
    >> Tableau=textscan(fid,'%s',Inf,'delimiter','\n');
    Je souhaite juste récupérer le txt en tableau mais ça ne marche pas comme ça. J'ai récupéré un Tableau 1x1 en sortie. Je ne maitrise pas tout ce que j'ai fait donc si vous pouviez m'éclairer

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Citation Envoyé par Tom dB Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tableau=textscan(fid,'%s',Inf,'delimiter','\n')
    Trouves-tu que les données contenues dans ton fichiers ressemblent à des chaînes de caractères ? Moi je vois plutôt des valeurs numériques.
    Je te conseille de bien t'intéresser à la partie formatSpec de la documentation de la fonction textscan

  8. #8
    FLB
    FLB est déconnecté
    Modérateur
    Avatar de FLB
    Homme Profil pro
    Ing. Aérospatiale
    Inscrit en
    Juin 2003
    Messages
    770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ing. Aérospatiale
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2003
    Messages : 770
    Points : 1 185
    Points
    1 185
    Par défaut
    L'utilisation d'une virgule à la place du point est problématique sous Matlab, textscan ne lira des données flottantes que si un point est utilisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    fid=fopen('045639 T01 02 1028710.txt','r');
    tableauTxt=textscan(fid,'%s','delimiter','\n');
    data=strrep(tableauTxt{1},',','.');
    for idData = 1:length(data)
        tabCell = textscan(data{idData},'%f%f%f%f%f%f%f');
        Tableau(idData,:)=cell2mat(tabCell);
    end
    fclose(fid)

  9. #9
    Invité
    Invité(e)
    Par défaut
    Ou de façon plus optimisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    fid=fopen('045639 T01 02 1028710.txt','r');
    data = strrep(fread(fid, '*char').', ',', '.');
    fclose(fid);
    T = textscan(data,'%f%f%f%f%f%f%f', 'CollectOutput', true);

  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 : 52 882
    Points
    52 882
    Par défaut
    peut s'écrire plus simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fread(fid, [1 inf], '*char')
    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)

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 85
    Points : 34
    Points
    34
    Par défaut
    Citation Envoyé par Winjerome Voir le message
    Bonjour,

    Trouves-tu que les données contenues dans ton fichiers ressemblent à des chaînes de caractères ? Moi je vois plutôt des valeurs numériques.
    Je te conseille de bien t'intéresser à la partie formatSpec de la documentation de la fonction textscan
    Ça serait donc %c à la place de %s ?

    J'ai essayé ce que tu m'as mis FLB et j'ai ce message d'erreur :
    ??? Error using ==> strrep
    Cell elements must be character arrays.

  12. #12
    FLB
    FLB est déconnecté
    Modérateur
    Avatar de FLB
    Homme Profil pro
    Ing. Aérospatiale
    Inscrit en
    Juin 2003
    Messages
    770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ing. Aérospatiale
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2003
    Messages : 770
    Points : 1 185
    Points
    1 185
    Par défaut
    J'ai testé mon code sur tes 2 lignes, mais il n'est pas très robuste. As tu essayé ce que te propose WinJerome, amélioré par Dut?
    Une fois que tu as compris le principe de textscan, tu peux l'utiliser à ta convenance : tu peux par exemple ouvrir ton fichier (fopen), lire les lignes en boucles (fgetl), faire un textscan sur chaque ligne, et fermer ton fichier.

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 85
    Points : 34
    Points
    34
    Par défaut
    Salut !

    Alors oui j'ai essayé le code que vous m'avez laissé mais je me retrouve avec un tableau data qui n'a qu'une seule case de rempli (1x1) et où je retrouve les quatre première ligne de mon .txt dans la même case.
    Si j'ai bien compris l'utilité du fread, il ne faudrait pas mettre [7 inf] à la place de [1 inf] pour pouvoir récupérer les 7 colonnes et les 10000 lignes ? Enfin j'ai essayé mais ça me met un message d'erreur et je ne sais pas pourquoi.


    Après je n'ai pas tout compris de l'utilisation du textscan.

  14. #14
    FLB
    FLB est déconnecté
    Modérateur
    Avatar de FLB
    Homme Profil pro
    Ing. Aérospatiale
    Inscrit en
    Juin 2003
    Messages
    770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ing. Aérospatiale
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2003
    Messages : 770
    Points : 1 185
    Points
    1 185
    Par défaut
    Salut Tom dB,
    tu peux nous montrer ton code ? Et le cas échéant le message erreur complet que Matlab t'envoie.
    N'hésite pas à tester les exemples de la doc pour bien comprendre ce que fait textscan.

  15. #15
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Tom dB Voir le message
    Alors oui j'ai essayé le code que vous m'avez laissé mais je me retrouve avec un tableau data qui n'a qu'une seule case de rempli (1x1) et où je retrouve les quatre première ligne de mon .txt dans la même case.
    Ce n'est pas data mais T que tu obtiens ainsi, et c'est un tableau de cellules.

    Citation Envoyé par Tom dB Voir le message
    Si j'ai bien compris l'utilité du fread, il ne faudrait pas mettre [7 inf] à la place de [1 inf] pour pouvoir récupérer les 7 colonnes et les 10000 lignes ? Enfin j'ai essayé mais ça me met un message d'erreur et je ne sais pas pourquoi.
    Non fread utilisé comme me l'a rectifié Dut stocke tous les caractères du fichier dans un vecteur ligne, ce qui permet ensuite de remplacer les virgules par des points. Le tout est ensuite lu de façon formatée par textscan afin d'en retirer les 7 colonnes de données numériques (7 fois %f donc).

  16. #16
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 85
    Points : 34
    Points
    34
    Par défaut
    Ah ok c'est donc bien [1 inf].

    Par contre FLB j'ai eu un message d'erreur en remplaçant [1 inf] par [7 inf] et non pas en utilisant le code de Jerome et Dut.
    J'ai effectivement la matrice T mais j'ai que des NaN et dans la case 1x1 de la matrice T au lieu d'avoir 1....x7.


    EDIT : Je viens de double cliquer sur la case 1x1 de T et j'ai d'un seul coup tout vu apparaitre correctement. Comment se fait il ? Et j'ai toujours sur le workspace un matrice T avec comme Value <1x1 cell>. C'est normal ?
    Du moins ça me pose un problème car je veux faire des plot avec ce tableau et je ne peux pas car double et cell sont incompatibles ! Comment dois-je faire ?

    Je ne sais pas comment éviter d'avoir toutes mes mesures dans la case 1x1 de la matrice T. Car je dois faire des plot après et je ne peux pas dans ce cas.

  17. #17
    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 : 52 882
    Points
    52 882
    Par défaut
    Il suffit d'utiliser T{1} avant l'indexage classique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    T{1}(:,1) % sélection de la première colonne
    T{1}(1,:) % sélection de la première ligne
    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)

  18. #18
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 85
    Points : 34
    Points
    34
    Par défaut
    J'ai effectivement trouvé cette commande dans la FAQ, mais je voulais savoir si l'on pouvait 'transformer' la matrice T en un autre de la taille <10000x7> ?
    Parce que je souhaiterai utiliser ses propriétés pour par exemple, faire un vecteur temps de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    t=0:1:"nombre de ligne de la matrice T"
    J'ai essayé d'utiliser ça : t=0:1:T{1}(:,1) et ça ne marche pas.

  19. #19
    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 : 52 882
    Points
    52 882
    Par défaut
    Il suffit de faire comme ceci :

    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
    >> T{1} = rand(5,3);
    >> size(T{1})
     
    ans =
     
         5     3
     
    >> size(T{1},1)
     
    ans =
     
         5
     
    >> size(T{1},2)
     
    ans =
     
         3
    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)

  20. #20
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 85
    Points : 34
    Points
    34
    Par défaut
    Exact !
    Ça marche même avec 'length' je viens de voir. Merci en tout cas. Je pense que le sujet peut être clos.
    Merci à vous tous !

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

Discussions similaires

  1. [Python 3.X] Considération de la virgule comme séparateur décimal
    Par rodicus dans le forum Général Python
    Réponses: 4
    Dernier message: 19/01/2015, 17h47
  2. Réponses: 13
    Dernier message: 03/12/2008, 13h54
  3. Lecture fichier de données
    Par milcos dans le forum Fortran
    Réponses: 1
    Dernier message: 10/01/2008, 18h37
  4. [RegEx] Tester la saisie d'un champ numérique avec virgule
    Par p_m_g dans le forum Langage
    Réponses: 1
    Dernier message: 30/12/2007, 22h36
  5. numérique avec virgule sous access
    Par crovette51101 dans le forum Access
    Réponses: 3
    Dernier message: 14/02/2007, 08h54

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