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 texte par "block"


Sujet :

MATLAB

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Homme Profil pro
    Éternel universitaire
    Inscrit en
    Avril 2012
    Messages
    421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Éternel universitaire

    Informations forums :
    Inscription : Avril 2012
    Messages : 421
    Par défaut Lecture fichier texte par "block"
    Bonjour,

    J'ai un fichier texte composé de plusieurs blocks. Ce fichier est formaté comme suit (j'ai ajouté des commentaires juste pour l'exemple)
    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
     
         387     %Header
        9240     %Header
    Fonte de la neige   % Header
    2007 307 0           % Signal début de mon block
    -280      0.00        % données
    -267      0.00        % données
    -238      0.00        % ...
    -210      0.00
    -199      0.00
    ...
    ...
    384      0.00
    385      0.00
    386      0.00
    387      0.00      % données
    2007 307 3         % début 2e block
    -280      0.00     % données
    -267      0.00     % données
    -238      0.00
    -210      0.00
    -199      0.00
    ...
    Le nom des block est toujours au même format: 2007 307 0; 2007 307 3; ... ;2010 365 21
    Les blocks sont de longueur constantes, 387 lignes de données.
    Le fichier texte comporte 9232 blocks

    Ce que je souhaiterais faire:
    - récupérer le nom de chaque block
    - extraire 9232 matrices pour les 9232 blocks qui composent mon fichier .txt. Je voudrais obtenir donc 9232 matrices de taille 387x2.

    J'avais initialement en tête d'utiliser fgets, mais ça ne me semble pas super propre ni trivial, car il me semble que je serais obligé de faire appel à str2double ou autre chose dans le genre. J'avais également pensé à utiliser 'CommentStyle' de la fonction textscan, mais le nom de mon block change en permanence... Bref, je ne sais pas trop comment me dépatouiller.

    Merci pour votre aide !

  2. #2
    Membre expérimenté
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 265
    Par défaut
    il me semble que fread fait cela.
    pour lire un block d'un coup ça ressemblerait a ça il me semble :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    A=fread(file,[387 2],'double')

  3. #3
    Membre chevronné
    Homme Profil pro
    Éternel universitaire
    Inscrit en
    Avril 2012
    Messages
    421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Éternel universitaire

    Informations forums :
    Inscription : Avril 2012
    Messages : 421
    Par défaut
    Citation Envoyé par gpcbitnik38 Voir le message
    il me semble que fread fait cela.
    Merci,
    Corrige moi si je me trompe, mais est-ce que fread n'est pas dédiée à la lecture de fichiers binaires ?

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    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 317
    Par défaut
    Un début de solution :

    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
    fid = fopen('data.txt', 'rt');
     
    header{1} = fscanf(fid, '%d\n', 1);
    header{2} = fscanf(fid, '%d\n', 1);
    header{3} = fgetl(fid);
     
    numLinesPerBlocks = header{1};
    numBlocks = header{2};
     
    for n = 1:numBlocks
     
        name{n} = fscanf(fid, '%d', 3);
     
        blocks{n} = fscanf(fid, '%f', [2 numLinesPerBlocks]).';
     
    end
     
    fclose(fid);
    À toi de l'adapter à ton besoin.

    Citation Envoyé par thecrazydonut Voir le message
    Corrige moi si je me trompe, mais est-ce que fread n'est pas dédiée à la lecture de fichiers binaires ?
    Fichier texte n'est qu'un fichier binaire contenant des valeurs numériques qui sont à interpréter comme des caractères :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >> 'A'+0
     
    ans =
     
        65
     
    >> char(65)
     
    ans =
     
    A
    On peut donc utiliser fread pour lire un fichier texte… caractère par caractère.
    Voir par exemple dans cette contribution : Remplacement de caractères ou de mots dans un fichier texte

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

Discussions similaires

  1. Lecture fichier texte ligne par ligne
    Par LinuxUser dans le forum C++
    Réponses: 7
    Dernier message: 14/01/2013, 15h27
  2. Réponses: 2
    Dernier message: 26/04/2011, 19h23
  3. Réponses: 3
    Dernier message: 28/11/2010, 19h56

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