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 :

Besoin d'extraire des données d'un fichier txt


Sujet :

MATLAB

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 15
    Points : 1
    Points
    1
    Par défaut Besoin d'extraire des données d'un fichier txt
    Bonjour

    J'ai lu la plupart des discussions sur les forums sur la lecture de fichiers txt à partir de Matlab mais je n'arrive toujours pas à faire mon programme.
    Je suis en stage et je suis débutant en Matlab. J'aurais besoin de savoir comment extraire certaines données au sein d'un fichier txt.


    Voici une séquence du fichier :
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    headerVersion : 26 sequenceNumber: 2
    messageType : 1 nodeType : 1
    nodeID : 5
    Timestamp : 1259578258 ms: 321
    Pos Long/Lat : 2.082649625 / 48.76301462
    PosVar aa/bb : 111 / 111
    Speed : 0.26 Heading : 42.4958
    txPower : 3 Power/Antenna : 0/3
    Priority : 0
    +Vehicle PAYLOAD:
    messageID : 0 protocolVer : 25
    elevation : 2000 type : 10 / 20
    size WLH : 0.63 / 1.27 / 12.75
    longAccel : 0 yawRate : 0
    extLights : 85 accelCtrl : 155
    IcoMatrix : 0/0/0/111/0/0/0/79/0/0/63/0/127/
    +DataElementPayload: [1]:
    PositionTimeStamp : 1259578258 / 160
    -SatelliteData: EMPTY
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    Plusieurs séquences s'enchainent et j'aurais besoin de récupérer les valeurs correspondant au "Timestamp", à la "PositionTimeStamp" et à la "Pos Long/Lat".

    Est-ce que quelqu'un pourrait m'aider ?

  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 318
    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 318
    Points : 52 957
    Points
    52 957
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    X = textread('data.txt','%s','delimiter','\n');
     
    idx = strncmp(X,'Timestamp',9);
    idx = find(idx);
     
    for n = 1:numel(idx)
       [A(n),B(n)] = strread(X{idx(n)},'Timestamp : %d ms: %d');
    end
    C'est l'idée générale...

    Prend bien le temps de comprendre ce que fais chaque ligne en enlevant les ; à la fin de chacune d'elle

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 15
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup pour ton aide.
    Mais il y a un petit problème d'approximation. Matlab récupère le Timestamp mais il fait une approximation. Comment puis-je enlever cette approximation ? il me faut le nombre exact :
    "1259578258" et non "1.2596e+009"

  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 318
    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 318
    Points : 52 957
    Points
    52 957
    Par défaut
    Il n'y a aucune approximation.

    C'est juste un problème d'affichage :


  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 15
    Points : 1
    Points
    1
    Par défaut
    Merci ca marche parfaitement

  6. #6
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 15
    Points : 1
    Points
    1
    Par défaut
    J'ai un message erreur quand j'essaie de récupérer la vitesse. Et je n'arrive pas à la debuger. Est-ce que quelqu'un peut m'expliquer pourquoi ca ne marche pas dans ce cas alors que j'arrive à récupérer les positions longitude/lat et les TimeStamps avec la même méthode ?

    Voici le code écrit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    %Récupération de la vitesse
    SpeedInLag = strncmp(logInLag,'Speed',5)
    SpeedInLag = find(SpeedInLag)
     
    for n = 1:numel(SpeedInLag)
        vitInLag = strread(logInLag{SpeedInLag(n)},'Speed : %d')
    end
    Merci

  7. #7
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 828
    Points
    14 828
    Par défaut
    Et quel est le message d'erreur ?

  8. #8
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 15
    Points : 1
    Points
    1
    Par défaut
    Voici le message erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ??? Trouble reading literal string from file (row 2, field 1) ==> .26	 Heading       : 42.4958
     
    Error in ==> strread at 51
        [varargout{1:nlhs}]=dataread('string',varargin{:});
     
    Error in ==> RecuperationLog at 26
        vitInLag = strread(logInLag{SpeedInLag(n)},'Speed : 410812832')
    Bon courage à tous ceux qui reprennent le travail

  9. #9
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 318
    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 318
    Points : 52 957
    Points
    52 957
    Par défaut
    La valeur que tu cherches à lire est un nombre réel, il faut utiliser le format %f à la place de %d

    Voir la documentation de FPRINTF pour l'ensemble des formats disponibles

  10. #10
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 15
    Points : 1
    Points
    1
    Par défaut
    J'ai fait la modification mais il ne veut toujours pas. Je comprends pas trop pourquoi.
    %
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ??? Trouble reading literal string from file (row 2, field 1) ==> Heading       : 42.4958
     
    Error in ==> strread at 51
        [varargout{1:nlhs}]=dataread('string',varargin{:});
     
    Error in ==> RecuperationLog at 26
        vitInLag = strread(logInLag{SpeedInLag(n)},'Speed : 1382753251727156800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000')

  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 318
    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 318
    Points : 52 957
    Points
    52 957
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [A,B] = strread(logInLag{SpeedInLag(n)},'Speed : %f Heading : %f')
    ou pour ne récupérer que le premier champ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    A = strread(logInLag{SpeedInLag(n)},'Speed : %f Heading : %*f')

  12. #12
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 15
    Points : 1
    Points
    1
    Par défaut
    J'ai aussi cherché à récupérer les numéros de "sequenceNumber" en fin de ligne/chaine. J'ai donc essayé d'utiliser strcmp et non strncmp pour comparer les chaines. Mais lors de la recherche, Matlab ne trouve pas la chaine de caractère 'sequenceNumber' et me renvoie que des zéros. Est-ce qu'il y a une commande spécifique pour trouver une sous-chaine dans une chaine ?

    voila mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    %Récupération des numéro de Tag
    SequenceNumberInLag = strcmp(logInLag,'sequenceNumber')
    SequenceNumberInLag = find(SequenceNumberInLag)
     
    for n = 1:numel(SequenceNumberInLag)
        TagNumberInLag= strread(logInLag{SequenceNumberInLag(n)},'sequenceNumber : %d')
    end

  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 318
    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 318
    Points : 52 957
    Points
    52 957
    Par défaut
    Citation Envoyé par Paul.R Voir le message
    J'ai aussi cherché à récupérer les numéros de "sequenceNumber" en fin de ligne/chaine.
    Pourquoi ne pas plutôt chercher "headerVersion" avec la même logique que précédemment ?

    Et ensuite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    A = strread(...,'headerVersion : %*d sequenceNumber: %d');

  14. #14
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 15
    Points : 1
    Points
    1
    Par défaut
    Ah d'accord j'ai compris la logique. Merci beaucoup

  15. #15
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 15
    Points : 1
    Points
    1
    Par défaut
    J'essaie de mettre en forme les données récupérées dans un fichier texte sous forme de colonnes (une pour chaque paramètre). Mais quand j'écris dans un fichier texte, toutes les colonnes sont mises les unes en dessous des autres alors que je les voudrais, les unes à côté des autres.

    Comment je dois faire ?

    Voici mon code :

    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
    %Définition d'une structure LogIncomingLag 
    LogIncomingLag.NumeroTag = TagNumberInLag;
    LogIncomingLag.Latitude = LongInLag;
    LogIncomingLag.Longitude = LatInLag;
    LogIncomingLag.Vitesse = vitInLag;
    LogIncomingLag.TimeStampUnix = UnixTimeStampInLag;
    LogIncomingLag.TimeStampUnixms = UnixTimeStampmsInLag;
    LogIncomingLag.PosTimeStampUnix = PosUnixTimeStampInLag;
    LogIncomingLag.PosTimeStampUnixms = PosUnixTimeStampmsInLag;
     
    %Matrices regroupant les paramètres par colonnes du fichier log Incoming et Outgoing de la Laguna et de l'Espace
    champsInLag = fieldnames(LogIncomingLag);
    for k=1:length(champsInLag)
        MatLogInLag(:,k)=LogIncomingLag.(champsInLag{k});
    end
     
    %%%%%%%%%%%%%%% Récupération des données dans un fichier txt %%%%%%%%%%%%%%
    LogOutInLagBilan = fopen('LogOutInLagBilan.txt','wt')
    fprintf(LogOutInLagBilan,'%f\n',MatLogInLag)
    fclose(LogOutInLagBilan)

  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 318
    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 318
    Points : 52 957
    Points
    52 957
    Par défaut
    Essaie ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    MatLogInLag = [TagNumberInLag(:) LongInLag(:) LatInLag(:) vitInLag(:) UnixTimeStampInLag(:) UnixTimeStampmsInLag(:) PosUnixTimeStampInLag(:) PosUnixTimeStampmsInLag(:)];
     
    LogOutInLagBilan = fopen('LogOutInLagBilan.txt','wt');
       fprintf(LogOutInLagBilan,'%f\n',MatLogInLag.');
    fclose(LogOutInLagBilan);

  17. #17
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 15
    Points : 1
    Points
    1
    Par défaut
    Ca range les résultats par sequence et les colonnes sont toujours mises les une en dessous des autres :

    Ce que je trouve dans le dossier d'écriture :
    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
     
    2.000000
    0.036349
    0.851075
    0.260000
    1259578258.000000
    321.000000
    1259578258.000000
    160.000000
    2.000000
    0.036347
    0.851071
    0.000000
    1259578258.000000
    499.000000
    1259578258.000000
    374.000000
    3.000000
    0.036349
    0.851075
    0.260000
    1259578258.000000
    820.000000
    1259578258.000000
    660.000000
    3.000000
    0.036347
    0.851071
    0.000000
    1259578258.000000
    999.000000
    1259578258.000000
    874.000000
    4.000000
    0.036349
    0.851075
    0.260000
    1259578259.000000
    320.000000
    1259578259.000000
    161.000000
    4.000000
    0.036347
    0.851071
    0.000000
    1259578259.000000
    499.000000
    1259578259.000000
    374.000000
    5.000000

  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 318
    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 318
    Points : 52 957
    Points
    52 957
    Par défaut
    Que retourne ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    size(TagNumberInLag) 
    size(LongInLag) 
    size(LatInLag) 
    size(vitInLag) 
    size(UnixTimeStampInLag) 
    size(UnixTimeStampmsInLag) 
    size(PosUnixTimeStampInLag) 
    size(PosUnixTimeStampmsInLag)

  19. #19
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 15
    Points : 1
    Points
    1
    Par défaut
    Cela
    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
     
    ans =
         1   965
    ans =
         1   965
    ans =
         1   965
    ans =
         1   965
    ans =
         1   965
    ans =
         1   965
    ans =
         1   965
    ans =
         1   965

  20. #20
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 15
    Points : 1
    Points
    1
    Par défaut
    J'ai trouvé merci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf(LogOutInLagBilan,'%f %f %f %f %f %f %f %f\n',[MatLogInLag(:,1) MatLogInLag(:,2) MatLogInLag(:,3) MatLogInLag(:,4) MatLogInLag(:,5) MatLogInLag(:,6) MatLogInLag(:,7) MatLogInLag(:,8)].')

Discussions similaires

  1. extraire des données d'un fichier .txt
    Par granbapt dans le forum C
    Réponses: 6
    Dernier message: 09/08/2012, 13h39
  2. [AC-2003] extraire des données d'un fichier txt en VBa
    Par afifaNancy dans le forum VBA Access
    Réponses: 8
    Dernier message: 24/04/2012, 17h41
  3. Extraire des données d'un fichier txt dans un vecteur
    Par sam14 dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 22/02/2012, 13h56
  4. Extraire des données d'un fichier .txt
    Par carlou135 dans le forum C++
    Réponses: 3
    Dernier message: 18/02/2008, 17h55
  5. Réponses: 7
    Dernier message: 29/09/2005, 11h19

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