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 d'un fichiers.txt de format aléatoire


Sujet :

MATLAB

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2010
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 47
    Points : 21
    Points
    21
    Par défaut lecture d'un fichiers.txt de format aléatoire
    Bonjour,

    J'ai un problème pour lire un fichier txt dont le nombre de colonne et de ligne peut varier.

    Pour le moment j'utilise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [vec1 vec2 ... vecn] = textread('log.txt','%s %s %s .... %s');
    Mais je suis obligé de modifier mon code à chaque fois que le fichier 'log.txt' ne contient pas le même nombre de variables enregistrées.

    Existe-il un moyen de récupérer une matrice (Nb_colonnes x Nb_lignes) contenant tout mon fichier ?

    Merci.

  2. #2
    Nouveau membre du Club
    Profil pro
    Physicien médical
    Inscrit en
    Juillet 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Physicien médical
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2010
    Messages : 47
    Points : 35
    Points
    35
    Par défaut
    Bonjour,

    Tu as essayé d'utiliser importdata?

  3. #3
    Membre à l'essai
    Inscrit en
    Janvier 2010
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 47
    Points : 21
    Points
    21
    Par défaut
    Nan. J'ai pas essayé. Je vais regarder de ce coté là.

    Merci.

  4. #4
    Membre à l'essai
    Inscrit en
    Janvier 2010
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 47
    Points : 21
    Points
    21
    Par défaut
    Je viens d'essayer mais pour le moment, j'arrive seulement à récupérer toutes les données de mon fichier dans une matrice une seul colonne. Ce qui ne me permet pas d'exploiter mes données par la suite.

  5. #5
    Nouveau membre du Club
    Profil pro
    Physicien médical
    Inscrit en
    Juillet 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Physicien médical
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2010
    Messages : 47
    Points : 35
    Points
    35
    Par défaut
    Hmf...

    Au pire, est ce que tu peux evaluer la taille maximale des colonnes de ton fichier texte?

    Tu prendrais cette valeur, puis tu initialises un tableau de zéros, de la taille maximale... et tu le remplis comme tu avais fait au debut..

    Ca fait un peu bricolage peut-être

  6. #6
    Membre à l'essai
    Inscrit en
    Janvier 2010
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 47
    Points : 21
    Points
    21
    Par défaut
    Bon ben je crois que je fais me lancer dans le bricolage alors

    Merci.

  7. #7
    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 166
    Points
    53 166
    Par défaut
    Tu pourrais nous montrer à quoi ressemble un de tes fichiers ?
    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)

  8. #8
    Membre à l'essai
    Inscrit en
    Janvier 2010
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 47
    Points : 21
    Points
    21
    Par défaut
    Bonjour DUT,

    Voilà l'aspect du fichier :

    dd/mm/yy hhmmss Pos[dddmm.mm] Airtemp AWA_TARG AW_angle
    15/02/2011 11:05:29 4743.6178N 322.2312W 0 64
    15/02/2011 11:05:30 4743.618N 322.2313W 0 63
    ...

    Sur la première ligne, j'ai le nom de toutes les variables enregistrées, il peut en avoir jusqu'à 100.

    Les lignes d'en dessous donnent les valeurs des variables. Il peut y avoir jusqu'à plus de 10000 lignes.

    Mais pour le moment je ne vois aucun moyen de récupérer proprement ces valeurs !

    La fonction textread('donnees.txt', '%s') me permet de récupérer toutes ces valeurs dans un vecteur d'une seule colonne mais il faut que je trouve un moyen de le redécouper après avoir lu combien de variables contenaient mon fichier.

  9. #9
    Membre habitué
    Homme Profil pro
    Ingénieur opto-électronique
    Inscrit en
    Avril 2010
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur opto-électronique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2010
    Messages : 129
    Points : 157
    Points
    157
    Par défaut
    Et un fgetl sur ta premiere ligne et une analyse du texte que ça te donnerait pour compter le nombre de colonnes puis un textscan sur la suite, ça ne marcherait pas ?

  10. #10
    Membre à l'essai
    Inscrit en
    Janvier 2010
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 47
    Points : 21
    Points
    21
    Par défaut
    Lorsque je fais un fgetl sur ma première ligne du fichier, j'obtiens une chaine de caractère contenant toute la ligne attachée. Donc je n'arrive même pas à extraire le nombre de variable de la première ligne !!!

    Terminer sa semaine en restant bloqué sur un problème de lecture, c'est très frustrant

    Encore 2 voir 3 heures à essayer de faire fonctionner çà !

  11. #11
    Membre habitué
    Homme Profil pro
    Ingénieur opto-électronique
    Inscrit en
    Avril 2010
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur opto-électronique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2010
    Messages : 129
    Points : 157
    Points
    157
    Par défaut
    un truc du genre probablement ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ligne=fgetl('monfichier');
     
    nbcol=size(sscanf(ligne,'%s'),1)

  12. #12
    Membre à l'essai
    Inscrit en
    Janvier 2010
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 47
    Points : 21
    Points
    21
    Par défaut
    Lorsque j'utilise la fonction fgetl toute ma ligne est copier dans une seul cellule.
    Donc la taille de ma ligne est de 1 !!

    Merci quand même

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

    La solution avec importdata:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    D = importdata('monfichier.txt',' ',1);
    Dernière modification par Invité ; 01/04/2011 à 15h33.

  14. #14
    Membre habitué
    Homme Profil pro
    Ingénieur opto-électronique
    Inscrit en
    Avril 2010
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur opto-électronique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2010
    Messages : 129
    Points : 157
    Points
    157
    Par défaut
    Lorsque j'utilise la fonction fgetl toute ma ligne est copier dans une seul cellule.
    Donc la taille de ma ligne est de 1 !!

    Merci quand même
    Oui, mais tu ne prends pas la taille de la ligne, mais la taille du scan de ta ligne en prenant en compte un délimiteur (' ' en l'occurrence). Ton sscan aura donc la taille du nombre de colonnes de ton fichier.

  15. #15
    Membre à l'essai
    Inscrit en
    Janvier 2010
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 47
    Points : 21
    Points
    21
    Par défaut
    Je vais essayer ça du coup.

    Sinon je me suis dis, j'ouvre mon fichier .txt dans Matlab je connait son nombre de ligne et colonne, est ce qu'il y aurait une syntaxe qui permet de lire le fichier et de le mettre directement dans un tableau (m x n) ?

  16. #16
    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 166
    Points
    53 166
    Par défaut
    Une petite fonction vite faite :
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    function numcols = findnumcolsintxt(filename,sep,headerlines)
     
    error(nargchk(1,3,nargin));
     
    if exist(filename,'file')~=2
        error('Unable to find file');
    end
     
    if nargin == 1
        sep = ' ';
        headerlines = 0;
    elseif nargin == 2
        if sprintf(sep)==9
            warning('Tabulations are treated as consecutive spaces')
            sep = ' ';
        end
        headerlines = 0;
    elseif nargin == 3 && ~isnumeric(headerlines)
        error('Third argument must be a scalar value');
    end
     
    fid = fopen(filename,'rt');
    for n = 1:headerlines
        fgetl(fid);
    end
    lig = fgetl(fid);
    fclose(fid);
     
    lig = strtrim(lig);
     
    if strcmp(lig(end),sep)
        lig(end) = [];
    end
     
    if strcmp(sep,' ')
        numcols = sum(diff(lig==sep)==-1)+1;
    else
        numcols = sum(lig==sep)+1;
    end
    • filename : nom du fichier
    • sep : séparateur de colonne (facultatif, caractère "espace" si absent)
    • headerlines : nombre de lignes d'entête à passer (facultatif, 0 si absent)


    Les tabulations et les espacements multiples sont considérés au final comme des espaces uniques.

    Dans ton cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    numcols = findnumcolsintxt('test.txt');
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    numcols = findnumcolsintxt('test.txt', ' ');
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    numcols = findnumcolsintxt('test.txt', ' ', 0);
    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)

  17. #17
    Membre à l'essai
    Inscrit en
    Janvier 2010
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 47
    Points : 21
    Points
    21
    Par défaut
    Voici un extrait d'un fichier. Si quelqu'un à d'autre idée pour le lire et le mettre sur une matrice je suis preneur.

    Merci.
    Fichiers attachés Fichiers attachés

  18. #18
    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 166
    Points
    53 166
    Par défaut
    Citation Envoyé par Dut Voir le message
    Les tabulations et les espacements multiples sont considérés au final comme des espaces uniques.
    Voici la même fonction mais qui ne modifie pas les tabulations :

    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
    32
    33
    34
    35
    function numcols = findnumcolsintxt(filename,sep,headerlines)
     
    error(nargchk(1,3,nargin));
     
    if exist(filename,'file')~=2
        error('Unable to find file');
    end
     
    if nargin == 1
        sep = ' ';
        headerlines = 0;
    elseif nargin == 2
        headerlines = 0;
    elseif nargin == 3 && ~isnumeric(headerlines)
        error('Third argument must be a scalar value');
    end
     
    fid = fopen(filename,'rt');
    for n = 1:headerlines
        fgetl(fid);
    end
    lig = fgetl(fid);
    fclose(fid);
     
    lig = strtrim(lig);
     
    if strcmp(lig(end),sep)
        lig(end) = [];
    end
     
    if strcmp(sep,' ')
        numcols = sum(diff(lig==sep)==-1)+1;
    else
        numcols = sum(lig==sprintf(sep))+1;  
    end
    Elle fonctionne sur ton fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >> findnumcolsintxt('exemple.txt','\t',0)
     
    ans =
     
        68
    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)

  19. #19
    Invité
    Invité(e)
    Par défaut
    Le séparateur était plutôt une tabulation, donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    D = importdata('exemple.txt','\t',1);
    Datas = D.textdata;
    I = cellfun(@(x) isempty(x),D.textdata);
    Datas(I) = num2cell(D.data)

  20. #20
    Membre à l'essai
    Inscrit en
    Janvier 2010
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 47
    Points : 21
    Points
    21
    Par défaut
    Merci beaucoup !

    J'arrive bien à déterminer le nombre des colonnes. Je crois que je n'aurai jamais trouver ce code tout seul

    Et juste une dernière question est il possible maintenant si je connait le nombre de colonne de créer directement une matrice qui lit de taille (inconnu x nbcolonne) ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. lecture d'un fichier txt ligne par ligne
    Par SoBaKa dans le forum Général Python
    Réponses: 4
    Dernier message: 06/03/2007, 12h02
  2. Lecture depuis un fichiers txt
    Par mask91 dans le forum C++
    Réponses: 15
    Dernier message: 04/03/2007, 22h40
  3. Réponses: 4
    Dernier message: 13/11/2006, 22h30
  4. Lecture et ecriture fichier txt
    Par jeanmy dans le forum Delphi
    Réponses: 12
    Dernier message: 07/08/2006, 17h23
  5. [debutant] lecture d'un fichier txt de 10mo
    Par karamazov994 dans le forum Entrée/Sortie
    Réponses: 11
    Dernier message: 19/04/2005, 15h55

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