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 :

Importer données de fichier texte sous MATLAB


Sujet :

MATLAB

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 18
    Points : 9
    Points
    9
    Par défaut Importer données de fichier texte sous MATLAB
    Bonjour,

    Je travaille sous MATLAB (je ne peux pas encore le tester!!):
    Voilà j'ai un fichier texte qui a des données sur 3 colonnes à l'infinie.
    Je vous écris ce que je pourrai avoir:

    1,635;-2,289;0,781
    ....................
    La première valeur correspond à x, la 2ème à y et la 3ème à z.
    J'aurai besoin de ces 3 valeurs afin d'effectuer des calculs puis d'afficher des courbes.
    Pensez-vous que ce code peut extraire ces 3 données correctement?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    fiche=fopen('fichier.txt','r') ;
     
    % Lecture des données qui se trouvent sur 3 colonnes
    % Quelque soit la quantité de données
    x=[inf];
    y=[inf];
    z=[inf];
     
    fscanf(fiche,'%d;%d;%d;'\n',x, y,z);
    % Mettre le vecteur de donnees dans le bon ordre
     
    %Fermeture du fichier texte
    fclose(fid);
    Après je pourrais travailler avec x,y et z comme je le souhaiterai ?

    Bonne journée

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 40
    Points : 40
    Points
    40
    Par défaut
    Si je me souviens bien, cela ne va pas marcher .

    premier problème: avec %d il faut que l'opérateur virgule soit le point (.) et non la virgule (,).
    second problème: tu ne vas pas récupérer directement tes valeurs x y z, tu va récupérer une matrice.
    troisième problème: il faut pour récupérer toutes les lignes que à la fin de chaque ligne, on trouve l'opérateur de séparation (soit ici ; )

    un code qui fonctionne (par 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
     
    clear all
    clc
    fiche=fopen('fichier.txt','r') ;
     
    % Lecture des données qui se trouvent sur 3 colonnes
    % Quelque soit la quantité de données
     
     
    a = fscanf(fiche,'%f;',[3 inf]);
    % Mettre le vecteur de donnees dans le bon ordre
    a = a.';
    x = a(:,1)
    y = a(:,2)
    z = a(:,3)
    %Fermeture du fichier texte
    fclose(fiche);
    avec le fichier texte suivant:
    2.635;-2.289;0.781;
    2.325;-5.679;+9.68;

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 18
    Points : 9
    Points
    9
    Par défaut
    Merci de m'avoir répondu!

    Le truc ce que j'ai l'impression que je vais avoir des souci!!
    Voilà j'aimerai vous exposer mon problème!
    Le fichier que l'on est en train de lire (fichier.txt) se rempli au fur et et à mesure du temps.
    Au départ quand je vais lancer mon programme matlab, il y aura des déja des données enregistrer mais il y en a qui arriveront pendant l'execution du programme.

    En gros ce programme doit afficher des courbes en temps réel, je connais le temps d'enregistrement entre deux acquisitions (environ 66ms =15hz)

    Est ce que vous pensez qu'il est possible de sortir des courbe en temps réelles ?

    Merci!!

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 18
    Points : 9
    Points
    9
    Par défaut
    Bonjour,

    Je pensais à un une chose, est ce que l'on peut calculer le nombre de valeur qu'il y a dans un fichier texte ?
    Comme ça après je pourrai adapter ma courbe au nombre de valeur qu'il y a dans mon fichier texte.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 18
    Points : 9
    Points
    9
    Par défaut
    Re

    J'ai trouvé ce code, il pourrai me donner le nombre de données qu'il y a en scannant le fichier et à chaque fois qu'il y a un ';' augmenter la variable n!!
    Le truc c'est qu'il marque :
    The input character is not valid in MATLAB statements or expressions

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while feof(fiche) == 0
       tline = fgetl(fiche);
       matches = findstr(tline, ";");
       num = length(matches);
       n=n+1;
    end
    Quelqu'un aurait il une idée ?
    S'il vous plaît!!

  6. #6
    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 830
    Points
    14 830
    Par défaut
    Citation Envoyé par Amaury63 Voir le message
    Le fichier que l'on est en train de lire (fichier.txt) se rempli au fur et et à mesure du temps.
    Ça ça craint.
    Normalement tu ne peux pas accéder de 2 endroits en même temps à un fichier (c'est-à-dire un qui écrit l'autre qui lit)

    Citation Envoyé par Amaury63 Voir le message
    J'ai trouvé ce code, il pourrai me donner le nombre de données qu'il y a en scannant le fichier et à chaque fois qu'il y a un ';' augmenter la variable n
    C'est une idée.
    Enfin si tu es sur d'avoir toujours 3 colonnes il suffit de compter les lignes

    Le message d'erreur que tu donnes n'est pas complet mais, si tu utilises bien MATLAB et non un clone, l'erreur vient des guillements ", MATLAB utilise des quotes ' pour les chaines de caractères.
    Règles du Forum

    Adepte de la maïeutique

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 40
    Points : 40
    Points
    40
    Par défaut
    Bonjour,

    Pour ta première question, je pense qu'il n'est pas possible de lire de manière dynamique dans un fichier texte dont les données évoluent au fil du temps. Mais je n'ai jamais vraiment essayé.

    ensuite pour obtenir le nombre de points, tu peux soit utiliser le code que tu as mis (en le corrigeant comme ci-dessous soit avec ' au lieu de " et en initialisant n), ou tu peux aussi l'obtenir avec length(x) qui te retourne la longueur du vecteur x

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    clear all
    clc
    fiche=fopen('fichier.txt','r') ;
    n=0;
    while feof(fiche) == 0
       tline = fgetl(fiche);
       matches = findstr(tline, ';');
       num = length(matches);
       n=n+1;
    end
    n
    %Fermeture du fichier texte
    fclose(fiche);

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 18
    Points : 9
    Points
    9
    Par défaut
    Bonjour,

    Merci pour ta réponse, je crains que lorsque j'aurai de nouvelles valeurs le programme reste bloqué dans sa boucle!!

    J'ai trouvé ça sur le site matlab, ça a marché:

    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
    clear all
    clc
    fiche=fopen('donnee.txt','r') ;
    
    % Lecture des données qui se trouvent sur 3 colonnes
    % Quelque soit la quantité de données
    
    a = fscanf(fiche,'%f;',[3 inf]);
    % Mettre le vecteur de donnees dans le bon ordre
    a = a.';
    x = a(:,1)
    y = a(:,2)
    z = a(:,3)
    
    %Fermeture du fichier texte
    fclose(fiche);
    [b,c]=size(x);%b correspond aux nombre de ligne et c au nombre de colonne
    t=linspace(0,1000,b); %valeur des abscisses  
    % réparties entre 0 et 50
    figure (1)
    plot(t,y)
    cela m'a donnée le nombre de ligne qu'il y a!! Cool

    Par contre je vois que tu me dis qu'il n'est pas possible de faire de la dynamique! Il y a des personnes qui parle de simulink, cela ne pourrait pas m'aidé ?

    Sinn est ce que l'on peut rafraichir un programme par exemple:
    toute les x seconde faire (programme) ?

    Merci

  9. #9
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Points : 4 661
    Points
    4 661
    Par défaut
    Citation Envoyé par Amaury63 Voir le message
    Sinn est ce que l'on peut rafraichir un programme par exemple:
    toute les x seconde faire (programme) ?
    Bonjour,

    Pour ca tu peux utiliser un timer:
    Bonne journée,
    Duf
    Simulink & Embedded Coder

    Au boulot : Windows 7 , MATLAB r2016b
    A la maison : ArchLinux mais pas MATLAB

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 18
    Points : 9
    Points
    9
    Par défaut
    Merci, je vais essayer, enfin je vais regarder sur le net car help sur mon matlab c'est comme la commande shutdown....!

    J'ai un autre pb, lorsque je lis une donné y, mon programme ne comprend mon if.

    pour y=65000 je trouve y1=63.47 franchement je ne sais pas d'où est ce que ça sort!!'
    J'ai essayé pour d'autre valeur, mais le truc c'est qu'a chaque fois il me divise y par 1024 sans regarder la condition!

    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
    clear all
    clc
    timer=0;
    while (timer) < 30
    fiche=fopen('donnee.txt','r') ;
    
    % Lecture des données qui se trouvent sur 3 colonnes
    % Quelque soit la quantité de données
    
    a = fscanf(fiche,'%f;',[3 inf]);
    % Mettre le vecteur de donnees dans le bon ordre
    a = a.';
    x = a(:,1)
    if x >2048
        x1=(x-65536)/1024;
    else
        x1=x/1024;
    end;
    
    y = a(:,2)
    if y > 2048 
        y1=(y-65536)/1024;
    else
        y1=y/1024;
    end;
    
    
    z = a(:,3)
    if z >2048
        z1=(z-65536)/1024;
    else
        z1=z/1024;
    end;
    
    %Fermeture du fichier texte
    fclose(fiche);
    [b,c]=size(x);%b correspond aux nombre de ligne et c au nombre de colonne
    t=linspace(0,b,b); %valeur des abscisses  
    % réparties entre 0 et 50
    figure (1)
    plot(t,y1)
    grid on;%grilles actives
    timer= timer+1;
    end

    arff c'est bizard non ?

  11. #11
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Points : 4 661
    Points
    4 661
    Par défaut
    Je suis pas sur de bien comprendre ce que tu fais mais est-ce que ceci ne correspondrait pas mieux?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
     
    y = a(:,2)
     
    y1(y>2048) = (y(y>2048)-65536)/1024;
    y1(y<=2048)=y(y<=2048)/1024;
    Simulink & Embedded Coder

    Au boulot : Windows 7 , MATLAB r2016b
    A la maison : ArchLinux mais pas MATLAB

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 18
    Points : 9
    Points
    9
    Par défaut
    ouahh trop cool, merci beaucoup Duf42!!
    J'ai une superbe courbe maintenant

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 18
    Points : 9
    Points
    9
    Par défaut
    Re,


    J'ai un souci avec un calcul que j'effectue. J'utilise les valeurs de mon fichier texte pour calculer une vitesse.
    Pour ceux que ça intéresse, les valeur stockées dans le fichier texte sont des accélérations que je reçois d'un module bluetooth (PS: on utilise un hyperterminal)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ??? Attempted to access vitesse(0,1); index must be a positive integer or logical.
     
    Error in ==> IG1 at 79
    vitesse(n,1) = vitesse(n-1,1)+x1(n,1)*temps;

    Voilà 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
    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
    clear all
    clc
    timer=0;
    while (timer) < 30
    fiche=fopen('donnee.txt','r') ;
    
    % Lecture des données qui se trouvent sur 3 colonnes
    % Quelque soit la quantité de données
    
    a = fscanf(fiche,'%f;',[3 inf]);
    % Mettre le vecteur de donnees dans le bon ordre
    a = a.';
    x = a(:,1)
    x1(x>2048) = (x(x>2048)-65536)/1024;
    x1(x<=2048)=x(x<=2048)/1024;
    
    
    y = a(:,2)
    y1(y>2048) = (y(y>2048)-65536)/1024;
    y1(y<=2048)=y(y<=2048)/1024;
    
    
    z = a(:,3)
    z1(z>2048) = (z(z>2048)-65536)/1024;
    z1(z<=2048)=z(z<=2048)/1024;
    
    %Fermeture du fichier texte
    fclose(fiche);
    [b,c]=size(x);%b correspond aux nombre de ligne et c au nombre de colonne
    t=linspace(0,b,b); %valeur des abscisses  
    
    
    %calcul des vitesses:
    temps = 0.666;
    vitesse=zeros(b,1);%déclaration matrice null de b lignes 
    
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    123
    for n=1:b 
    vitesse(n,1) = vitesse(n-1,1)+x1(n,1)*temps;
    end
    figure(1) plot(t,y1) figure(2) plot (t,x1) grid on;%grilles actives timer= timer+1; end
    J'ai déclaré un matrice de "vitesse" de 1 colonne et de b ligne.
    j'initialise la première valeur de vitesse à 0 puis j'effectue un calcul de récurrence qui utilise sa valeur précédente et une valeur de la matrice x1.

    Matlab ce n'est pas trop mon truc!! Je crois que ça se voit
    Merci de bien vouloir m'aider!
    Bonne journée

  14. #14
    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 830
    Points
    14 830
    Règles du Forum

    Adepte de la maïeutique

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 18
    Points : 9
    Points
    9
    Par défaut
    Merci Caro-Line, je suis arrivé à corrigé, héhé
    Trop bien ton tuto !!

    Je pose le code pour ceux que ça intéressera un jours:

    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
    clear all
    clc
    timer=0;
    while (timer) < 30
    fiche=fopen('donnee.txt','r') ;
     
    % Lecture des données qui se trouvent sur 3 colonnes
    % Quelque soit la quantité de données
     
    a = fscanf(fiche,'%f;',[3 inf]);
    % Mettre le vecteur de donnees dans le bon ordre
    a = a.';
    x = a(:,1)
    x1(x>2048) = (x(x>2048)-65536)/1024;
    x1(x<=2048)=x(x<=2048)/1024;
     
     
    y = a(:,2)
    y1(y>2048) = (y(y>2048)-65536)/1024;
    y1(y<=2048)=y(y<=2048)/1024;
     
     
    z = a(:,3)
    z1(z>2048) = (z(z>2048)-65536)/1024;
    z1(z<=2048)=z(z<=2048)/1024;
     
    %Fermeture du fichier texte
    fclose(fiche);
    [b,c]=size(x);%b correspond aux nombre de ligne et c au nombre de colonne
    t=linspace(0,b,b); %valeur des abscisses  
     
     
    %calcul des vitesses:
    temps = 0.666;
    vitesse=zeros(b,1);%déclaration matrice null de b lignes 
    for n=2:b 
    vitesse(n,1) = (vitesse(n-1,1)+y1(1,n)*temps);
    end
     
    for n=2:b 
    vitesse2(n,1) = vitesse (n,1)*3,6;
    end
     
    figure(1)
    plot(t,y1)
    figure(2)
    plot (t,vitesse2)
    grid on;%grilles actives
    timer= timer+1;
    end

    Bonne journée et merci beaucoup!!!!

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

Discussions similaires

  1. Importer les données d'un fichier texte sous Excel
    Par luksvibes dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 05/06/2013, 15h47
  2. [XL-2000] VBA - Parcourir dossiers, importer données de fichiers textes dans excel
    Par news4teab dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 20/04/2010, 18h09
  3. Réponses: 5
    Dernier message: 09/01/2008, 07h54
  4. Réponses: 1
    Dernier message: 19/01/2006, 19h22

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