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 :

Lire des données dans un fichier mixte (texte ET chiffres) [Débutant]


Sujet :

MATLAB

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 51
    Points : 20
    Points
    20
    Par défaut Lire des données dans un fichier mixte (texte ET chiffres)
    Bonjour,

    Je cherche désespérément à lire des données dans un fichier texte (tab-delimited), et assigner ces données à des variables dont les noms sont aussi à récupérer dans le header du fichier en question.

    Le fichier est organisé de manière assez classique :
    - la première ligne contient une info pas utile
    - la deuxieme ligne contient les noms des variables que je souhaite utiliser
    - les lignes suivantes contiennet les données que je souhaite assigner aux variables sus-mentionnées

    J'ai donc tant bien que mal écrit le script suivant, qui ne me fait pas d'erreur à la compilation, mais le résultat ne me convient pas. En effet il semble que les variables ne sont pas reconnues comme telles, mais plutôt comme des cell arrays.

    Ca m'arrangerait beaucoup si vous pouviez jeter un oeil sur ce code. Je suis assez confus par rapport à l'utilisation des structures ou des cell arrays en particulier.

    J'ai mis en PJ un exemple de fichier que je veux traiter. A noter que j'utilise la fonction 'readline' disponible ici :
    http://www.mathworks.com/matlabcentr...exchange/20026

    Un énorme merci pour votre aide

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
     
    clear all;
    close all;
    numsujet = 3; % le numero du sujet
    numsession = 1; % la session
     
    fname = ['chemin/Encodage' num2str(numsession) '_Sujet' num2str(numsujet) '_Data.txt'];
     
    % Open text file
    fid = fopen(fname);
     
    % Find out number of rows in file
    r=0;
    x=0;
     
    % Loop through data file until we get a -1 indicating EOF
    while(x~=(-1))
        x=fgetl(fid);
        r=r+1;
    end
    r = r-1; % nb of rows
     
    disp(['Number of rows = ' num2str(r)])
     
    frewind(fid);
     
    % Create varnames from second line of datafile
    Vs = readline(fname,2);
     
    colheaders = textscan(Vs,'%s');
    colheaders = genvarname(colheaders{1,1});
     
    c = length(colheaders); % nb of columns
    disp(['Number of columns = ' num2str(c)])
     
    fclose(fid);
     
    % Use textscan to read each field as (possibly quoted) text
    % Then step through every text field and replace it with an actual
    % number if sscanf can convert it to one.
    for i=3:r;
        line_i = readline(fname,i);
        line_i = textscan(line_i,'%q','delimiter','\t');
        for j=1:c;
     
            parsedisnum = sscanf(line_i{1,1}{1,1},'%f');
     
            % case sscanf fails to detect a float
            if isempty(parsedisnum) || numel(parsedisnum)<1
                a = line_i{1}(j);
     
            % case sscanf detects a float
            else
                a = parsedisnum;
            end
     
            suj.(colheaders{j})(i-2) = a;
        end
     
    end
    Fichiers attachés Fichiers attachés

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 640
    Points : 776
    Points
    776
    Par défaut
    Salut,

    personellement, je ne ferais pas comme ca. J'utiliserais tout simplement un textscan

    Ca te permet d'enlever l'entête et de récupérer tous tes champs avec les valeurs en une seule fois. La seule difficulté que tu renconteras concernera la délimitation des champs.

    La délimitation est en tab sur l'ensemble de tes données mais également sur le chemin d'accès dans une de tes variables... Faut donc trouver l'astuce pour que textscan ignore ces deux tab du "documents and setting".

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 51
    Points : 20
    Points
    20
    Par défaut
    Merci pour ta réponse,

    La raison pour laquelle je n'ai pas utilisé textscan est que mes fichiers de données n'ont pas tous le même nombre de colonnes, et je voulais que mon code marche pour tous.

    Et puis c'est pas très élégant d'écrire un truc comme textscan(ligne, %s %f %f %f ... x44 ), ou bien?

    Et puis ça ne change pas fondamentalement mon problème concernant les cell arrays ou bien?

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 640
    Points : 776
    Points
    776
    Par défaut
    Mais pas de soucis,

    C'était juste une remarque en passant. Ton script fonctionne très bien en utilisant readline.

    Du coup, tu veux faire quoi ? Récupérer le nom des headers et leur assigner les valeurs du fichier ? Parce que c'est ce que tu as avec ta structure.

    Tu prends suj.Duree et tu as bien toutes tes durées. C'est vrai que tu n'as pas de variable durée mais est ce que c'est un souci ?

    Bref, c'est surement la fin de semaine mais je vois pas ce que tu veux faire

  5. #5
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 51
    Points : 20
    Points
    20
    Par défaut
    En fait c'était plus à titre informatif, je me demandais si c'était propre comme code.

    Et effectivement, comme tu le notes, j'aurais aimé que les 'Durees' et compagnie soient des variables. Ce n'est pas une nécessité absolue mais je me demandais comment m'y prendre. J'ai essayé de plusieurs façon mais ça ne compilait plus...

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

    Ton test pour savoir si c'est un float n'est pas bon
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    clear all;
    close all;
    numsujet = 3; % le numero du sujet
    numsession = 1; % la session
    
    fname = fullfile('chemin',['Encodage' num2str(numsession) '_Sujet' num2str(numsujet) '_Data.txt']); % Plus sécurisant
    % Open text file
    fid = fopen(fname);
    
    % Find out number of rows in file
    r=0;
    x=0;
    
    % Loop through data file until we get a -1 indicating EOF
    while(x~=(-1))
        x=fgetl(fid);
        r=r+1;
    end
    r = r-1; % nb of rows
    
    disp(['Number of rows = ' num2str(r)])
    
    frewind(fid);
    
    % Create varnames from second line of datafile
    Vs = readline(fname,2);
    
    colheaders = textscan(Vs,'%s');
    colheaders = genvarname(colheaders{1,1});
    
    c = length(colheaders); % nb of columns
    disp(['Number of columns = ' num2str(c)])
    
    fclose(fid);
    
    % Use textscan to read each field as (possibly quoted) text
    % Then step through every text field and replace it with an actual
    % number if sscanf can convert it to one.
    for i=3:r;
        line_i = readline(fname,i);
        line_i = textscan(line_i,'%q','delimiter','\t');
        for j=1:c;
            a = line_i{1}{j};
            % case sscanf fails to detect a float
            if ~isnumeric(a)
                suj.(colheaders{j})(i-2,1:length(a)) = a;
                % case sscanf detects a float
            else
                suj.(colheaders{j})(i-2) = a;
            end    
        end
    end

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 640
    Points : 776
    Points
    776
    Par défaut
    Je te laisse regarder la réponse de Winjerome.

    Pour ce qui est de la création des noms de variables, tu peux regarder du côté de assignin

    Ca te permet de créer ce que tu souhaites faire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    assignin('base',colheaders{1},suj.ExperimentName)
    A toi de l'adapter à ton code.

  8. #8
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 51
    Points : 20
    Points
    20
    Par défaut
    OK, merci pour vos réponses je pense que je vais m'en sortir maintenant.

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

Discussions similaires

  1. Lire des données dans un fichier texte
    Par snakeisland dans le forum LabVIEW
    Réponses: 4
    Dernier message: 05/02/2014, 09h35
  2. Réponses: 6
    Dernier message: 02/12/2010, 22h04
  3. Ecrire & Lire des énumérés dans un fichier Texte
    Par WebPac dans le forum Langage
    Réponses: 8
    Dernier message: 18/06/2008, 10h04
  4. [VBS]Lire des données dans un fichier .txt
    Par kacxial dans le forum VBScript
    Réponses: 4
    Dernier message: 28/02/2007, 13h44
  5. Réponses: 3
    Dernier message: 22/02/2004, 20h09

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