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 :

Ouvrir .raw avec header avant et après


Sujet :

MATLAB

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Points : 476
    Points
    476
    Par défaut Ouvrir .raw avec header avant et après
    Bonjour,

    Voici mon petit problème. J'ai un fichier .raw (ouverture avec Excel, WordPad etc..) avec une header de 32 lignes avant 4 colonnes de données mais également avec un "header de fin"...

    Ce qui fait que quand j'essaye de l'ouvrir de la sorte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [DATA{1:4}] = textread('rawdata0001.raw','%f%f%f%f','delimiter','; \b\t','headerlines',32);
    il m'envoit le message d'erreur suivant :

    ??? Error using ==> dataread
    Trouble reading floating point number from file (row 511, field
    1) ==> FFT Successful\n

    Error in ==> textread at 176
    [varargout{1:nlhs}]=dataread('file',varargin{:});
    FFT Successful représente bien la 1ère ligne du Header de fin.

    Le but est simple : faire abstraction du "header de fin"

    Merci pour votre aide (et puis bonne année aussi!)

  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 316
    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 316
    Points : 52 948
    Points
    52 948
    Par défaut
    Je ferais comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    X = textread('rawdata0001.raw','%s','delimiter','\n','headerlines',32);
     
    idx = find(strncmp(X,'FFT',3));
    X(idx:end) = [];
    Il "suffit" ensuite de traiter le tableau de cellules X

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Points : 476
    Points
    476
    Par défaut
    Merci ! Bon j'ai essayé ensuite de traiter X mais c'est un cauchemars !

    >> X{1}()

    ans =

    0 5.578701e-04 0.000000e+00 4.376011e-05 2.406050e+02

    >> X{45}

    ans =

    44 5.291265e-04 -6.214043e-06 3.739349e-05 2.377500e+02

    tous les valeurs d'une même colonne de X non pas forcément le même nombre de chiffre significatif, et quand les valeurs sont négatives ça ajouter un caractère, les espaces entre les chaque colonne n'est pas non plus forcément égal à 1.

    Bref impossible de séparer les valeurs par indexage numérique. Il faudrait un indexage logique du type: séparer les nombres dont les caractères ne se touchent pas mais là je coince. Je n'arrive même pas à défnir les espaces :

    >> X{1}(2)

    ans =

    Merci d'avance !

  4. #4
    Membre éclairé Avatar de tubaas
    Homme Profil pro
    Acousticien
    Inscrit en
    Août 2009
    Messages
    641
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Acousticien
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2009
    Messages : 641
    Points : 825
    Points
    825
    Par défaut
    salut
    si dans une ligne le nombre de décimal est le même je te propose ceci à adapter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    a='gqyri rqgio hoqsf';
    a=reshape([a ' ']',find(isspace(a),1),(length(a)+1)/find(isspace(a),1))'
    a=a(:,1:end-1)
    mais il doit être plus efficace de le faire directement à la lecture en utilisant TEXTSCAN avec comme délimiteur de fin de ligne ('endofline') '\n' et d'utiliser les espace comme délimiteurs ('delimiter').
    tu auras alors un cell array à deux dimensions

  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 316
    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 316
    Points : 52 948
    Points
    52 948
    Par défaut
    Il serait préférable de commencer par une méthode de plus bas niveau :

    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
    fid = fopen('rawdata0001.raw','rt');
     
    for n=1:32
        fgetl(fid);
    end
     
    n = 1;
    while ~feof(fid)
     
        str = fgetl(fid);
     
        if strncmp(str,'FFT',3)
            break
        end
     
        % Extraction des données à partir de str ici
        data(n,:) = sscanf(str,'%f',[1,4]);
        n = n+1;
     
    end
     
    fclose(fid);
    Enfin c'est l'idée de base... essaies avec tes propres données.
    Tu pourras ensuite passer à une version plus "optimisée"

    Si vraiment tu n'y arrives pas, joint un fichier raw dans une archive zip ou rar à ton prochain message

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Points : 476
    Points
    476
    Par défaut
    Merci Tubaas, j'imagine quand tu parles de nombre de décimal tu veux parler également du nombre d'espace entre les valeurs: malhereusement celui ci n'est pas identique à chaque ligne, c'est à dire que si je rajoute un espace (en rouge) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    a='gqyri_ rqgio hoqsf';
    a=reshape([a ' ']',find(isspace(a),1),(length(a)+1)/find(isspace(a),1))'
    a=a(:,1:end-1)
    plus rien ne marche...

    Merci Dut mais problème également :

    ??? Subscripted assignment dimension mismatch.

    Error in ==> RheoOSC_dec2010_auto at 41
    data(n, = sscanf(str,'%f',[1,4]);
    Je vous joint un fichier à ouvrir... merci...désolé..
    Fichiers attachés Fichiers attachés

  7. #7
    Membre éclairé Avatar de tubaas
    Homme Profil pro
    Acousticien
    Inscrit en
    Août 2009
    Messages
    641
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Acousticien
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2009
    Messages : 641
    Points : 825
    Points
    825
    Par défaut
    ce que je voulais te montrer c'est qu'une fois que tu as lu le fichier tu peux toujours t'en tirer. à toi de construire ton algorithme.
    par exemple au lieu d'utiliser
    tu peux utiliseret récupèrer ce qu'il y a entre les espaces.
    Cependant le mieux est de le faire dès la lecture du fichier mais je te laisse voir avec Dut pour ça.

  8. #8
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 316
    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 316
    Points : 52 948
    Points
    52 948
    Par défaut
    Citation Envoyé par Newenda Voir le message
    Merci Dut mais problème également :
    Il y a une ligne remplie de 4 tabulations avant l'entete final.

    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
    fid = fopen('rawdata0001.raw','rt');
     
    for n=1:31
        fgetl(fid);
    end
     
    n = 1;
    while ~feof(fid)
     
        str = fgetl(fid);
     
        if ~isstrprop(str(1),'digit')
            break
        end
     
        data(n,:) = sscanf(str,'%f',[1,4]);
        n = n+1;
     
    end
     
    fclose(fid);
    Par contre, si tu connais le nombre d'échantillons à l'avance (ici 256) il y a encore plus simple...

    Et sinon il n'y a pas 4 mais 5 colonnes de données... si tu ne veux garder que les 4 dernières :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    data(n,:) = sscanf(str,'%*d%f%f%f%f',[1,4]);

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Points : 476
    Points
    476
    Par défaut
    Merci Dut, ça marche parfaitement... Merci Tubaas aussi, on en apprends tous les jours !

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Points : 476
    Points
    476
    Par défaut
    Hum finalement petit problème. En voulant ouvrir un autre fichier identique :

    rawdata0002.raw, il y a un message d'erreur :

    ??? Attempted to access str(1); index out of bounds because
    numel(str)=0.
    Comprends pas du tout le pourquoi du comment...

    MErci d'avance

    PS: en pièce jointe le fichier rawdata0002
    Fichiers attachés Fichiers attachés

  11. #11
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 316
    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 316
    Points : 52 948
    Points
    52 948
    Par défaut
    Dans le premier fichier, les lignes "vides" contenaient des tabulations pas dans le second...

    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
    fid = fopen('rawdata0001.raw','rt');
     
    for n=1:31
        fgetl(fid);
    end
     
    n = 1;
    while ~feof(fid)
     
        str = fgetl(fid);
     
        if isempty(str) || ~isstrprop(str(1),'digit')
            break
        end
     
        data(n,:) = sscanf(str,'%*d%f%f%f%f',[1,4]);
        n = n+1;
     
    end
     
    fclose(fid);

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Points : 476
    Points
    476
    Par défaut
    Ha oui ! super !

    Mais le rawdata0002 passe toujours pas, cette fois à cause du dernier str !
    Alors que dans rawdata0001 le dernier str était vide, dans rawdata0002 il vaut: str = ''.
    Et donc problème pour créer data !

    ??? Subscripted assignment dimension mismatch.

    Error in ==> RheoOSC_dec2010_auto2 at 33
    data(n,: ) = sscanf(str,'%f',[1,5]);

    Peut on éviter d'enregistrer le dernier str? ou alors créer une autre condition pour que str = '' soit virer?

  13. #13
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 316
    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 316
    Points : 52 948
    Points
    52 948
    Par défaut
    J'ai édité mon dernier code avant que tu ne répondes...

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Points : 476
    Points
    476
    Par défaut
    Merci ! maintenant c'est bon, pour tous les fichiers !

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 24/01/2015, 11h12
  2. Trigger avec action avant ET apres update de champ ?
    Par fredfred dans le forum Développement
    Réponses: 18
    Dernier message: 05/11/2011, 02h12
  3. [RegEx] preg_replace un caractère avec espace avant et après
    Par redah75 dans le forum Langage
    Réponses: 24
    Dernier message: 27/09/2011, 20h35
  4. Probleme avec Routine User avant et aprés l'export de JOb
    Par delilou dans le forum Développement de jobs
    Réponses: 1
    Dernier message: 18/03/2011, 10h47
  5. Exec avec paramètres avant et après exécutable
    Par blinkz0rz dans le forum ANT
    Réponses: 3
    Dernier message: 20/07/2006, 14h46

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