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 :

Problème pour importer un tableau d'un fichier texte


Sujet :

MATLAB

  1. #1
    Membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 171
    Points : 62
    Points
    62
    Par défaut Problème pour importer un tableau d'un fichier texte
    Bonjour,
    Je dispose d'un fichier texte contenant un tableau de valeurs numériques et je souhaiterait les importer dans un tableau sous matlab.
    Pour des premiers tests, j'ai créé un fichier texte bidon de la forme :

    1 2 3
    4 5 6

    Les chiffres sont séparés avec des espaces.

    J'ai utilisé la fonction importdata de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab = importdata('Tableau_test.txt',' ')
    et la réponse de matlab est :

    tab = 'ÿp1'

    Est ce quelqu'un pourrait me dire où est le problème ?
    Merci !!

  2. #2
    Membre averti
    Femme Profil pro
    Ingénieur informatique scientifique
    Inscrit en
    Mai 2010
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique scientifique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 313
    Points : 301
    Points
    301
    Par défaut
    Bonjour,
    ton code semble bon, j'ai créé également un fichier texte avec les valeurs
    1 2 3
    4 5 6

    et quand je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab = importdata('bidon.txt',' ')
    J'obtiens bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    tab =
     
         1     2     3
         4     5     6
    C'est peut-être un problème d'encodage de ton fichier? Pourtant si tu as créé un simple fichier texte c'est bizarre. En tout cas je ne t'aide pas beaucoup mais je peux te dire que le problème ne vient pas de ton code ^^'

  3. #3
    Membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 171
    Points : 62
    Points
    62
    Par défaut
    Effectivement, j'ai fait un autre test avec un autre fichier créé à partir de rien et ça a marché !
    Merci pour ta réponse!

  4. #4
    Membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 171
    Points : 62
    Points
    62
    Par défaut
    J'ai ouvert le fichier texte que je souhaite réellement ouvrir avec Matlab avec Notepad++. J'ai pu voir que l'encodage était "UCS-2 Little Endian".
    Si je change l'encodage en ANSI " à la main" avec Notepad et que j'importe le tableau dans matlab avec importdata, ça marche bien.
    Mais je voulais savoir si c'était possible, avec matlab, de directement convertir l'encodage du fichier en celui qu'on veut avant d'importer les données.
    Merci !

  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 302
    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 302
    Points : 52 884
    Points
    52 884
    Par défaut
    Pourrais-tu attacher ce fichier non converti à ton prochain message (mets le dans une archive zip ou rar) ?
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  6. #6
    Membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 171
    Points : 62
    Points
    62
    Par défaut
    voila le fichier en pièce jointe.

    Par ailleurs, quand je fais la procédure qui marche (décrite dans mon précédent post), j'ai une perte de précision dans mes données (passage de 8 à 4 chiffres significatifs). J'ai vu que c'était possible d'exporter des données avec une certaine précision mais que cette option n'était pas présente dans les fonctions d'import... une idée ?
    Fichiers attachés Fichiers attachés

  7. #7
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    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 302
    Points : 52 884
    Points
    52 884
    Par défaut
    Ce type d'encodage n'est pas supporté par fopen (pas plus que le UTF-16)

    Voici une alternative :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    fid = fopen('CBME2_B.1.0.0.2_06_01-Cond.txt','r','l');
     
    S = fread(fid,'*uint16');
     
    M = sscanf(char(S(2:end)),'%f');
    M = reshape(M,11,[]).';
     
    fclose(fid);
    Par contre, je ne peux pas en garantir la robustesse avec un seul fichier...

    Citation Envoyé par cedji Voir le message
    j'ai une perte de précision dans mes données (passage de 8 à 4 chiffres significatifs).
    Voir la FAQ : Pourquoi MATLAB affiche-t-il des valeurs tronquées ?
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  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 302
    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 302
    Points : 52 884
    Points
    52 884
    Par défaut
    Par curiosité, si ce n'est pas confidentiel, d'où proviennent ces fichiers ?
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  9. #9
    Membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 171
    Points : 62
    Points
    62
    Par défaut
    Merci pour ton aide!

  10. #10
    Membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 171
    Points : 62
    Points
    62
    Par défaut
    Ce sont les résultats donnés par une simulation d'un système optique avec Zemax. Chaque ligne correspond à une simu montecarlo différentes, et chaque colonne correspond à la valeur d'un des paramètres de sortie du systeme.

  11. #11
    Membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 171
    Points : 62
    Points
    62
    Par défaut
    Juste une question pour toi Dut,

    Dans le code que tu m'as fourni, à cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    M = reshape(M,11,[]).';
    Le nombre de colonnes est rentré "en dur". Or dans les tableau que j'ai à traiter, je ne sais pas à l'avance les dimensions. Est ce qu'il y aurait une méthode pour détecter le nombre de colonnes du tableau, peut etre en comptant le nombre d'espace ?

    Merci!

  12. #12
    Membre éprouvé
    Avatar de soft001
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2008
    Messages
    409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 409
    Points : 1 146
    Points
    1 146
    Par défaut
    Personnellement je préfère utiliser cette fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dlmread('CBME2_B.1.0.0.2_06_01-Cond.txt')
    Par contre je pense qu'il y a un problème avec ton fichier, car je n'arrive pas à lire son contenu mais si je crée un autre fichier et je copie le contenu de ton fichier dans ce nouveau fichier ça marche. Je ne vois pas aucune explication !!!!
    Si tu trouves ma réponse utile, n'oublies pas de voter pour ce me message

  13. #13
    Membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 171
    Points : 62
    Points
    62
    Par défaut
    Merci pour ta réponse Soft001!
    Si tu regardes le début de la discussion, tu comprendras pourquoi le fichier n'est pas lisible facilement!

  14. #14
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    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 302
    Points : 52 884
    Points
    52 884
    Par défaut
    Citation Envoyé par cedji Voir le message
    Est ce qu'il y aurait une méthode pour détecter le nombre de colonnes du tableau, peut etre en comptant le nombre d'espace ?
    Comme une valeur est écrite avec 15 caractères dans le fichier, on a pour chaque donnée avec l'espace qui précède :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >> numel(' 3.17722634E-001')
     
    ans =
     
        16
    donc voici ce que je propose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    fid = fopen('CBME2_B.1.0.0.2_06_01-Cond.txt','r','l');
     
    S = fread(fid,'*uint16');
    S(1) = []; % Caractère inutile au début du fichier
     
    idx = strfind(S.',[13 10]);
     
    n = (idx(1)-1)/16; % -1 car strfind renvoi l'indice du 13
     
    M = sscanf(char(S(2:end)),'%f');
    M = reshape(M,n,[]).';
     
    fclose(fid);
    Pour être encore plus robuste, on peut appliquer la même technique pour identifier les espaces et donc le nombre de caractères pour écrire une valeur dans le fichier (plutôt que de mettre 16 en dur dans le code)

    Citation Envoyé par soft001 Voir le message
    Par contre je pense qu'il y a un problème avec ton fichier, car je n'arrive pas à lire son contenu mais si je crée un autre fichier et je copie le contenu de ton fichier dans ce nouveau fichier ça marche. Je ne vois pas aucune explication !!!!
    C'est tout le sujet de la discussion.
    Il s'agit ici de lire un fichier dont l'encodage n'est pas supporté par fopen.
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  15. #15
    Membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 171
    Points : 62
    Points
    62
    Par défaut
    Merci pour ta réponse Dut ! (Dsl du retard, je n'avais pas vu ta réponse)

    Pourrais tu m'expliquer ce qui est fait à la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    idx = strfind(S.',[13 10]);
    ? car j'ai regardé l'aide de idx mais je ne comprends pas à quoi se réfère [13 10].
    Merci!

  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 302
    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 302
    Points : 52 884
    Points
    52 884
    Par défaut
    Selon le système d'exploitation, les retours à la lignes sont des caractères qui peuvent être :

    • sous Windows : \r\n
    • sous Unix/Linux/Mac (OS X) : \n
    • sous Mac (jusqu'à 9) : \r


    Les valeurs numériques de \r et \n sont respectivement 13 et 10.

    Voila pourquoi on peut chercher la position des retours à la ligne dans un fichier texte sous Windows en cherchant les valeurs [13 10]
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  17. #17
    Membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 171
    Points : 62
    Points
    62
    Par défaut
    Ok c'est tout compris !
    Je vais essayer d'utiliser la même méthode en cherchant les espaces!

Discussions similaires

  1. Réponses: 4
    Dernier message: 16/09/2010, 22h33
  2. [MySQL] Problème pour insérer les données d'un fichier texte vers une table Mysql !
    Par BARRIAU76 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 31/01/2008, 23h24
  3. problème pour importer fichier texte
    Par louffa dans le forum Outils
    Réponses: 2
    Dernier message: 30/01/2008, 14h31
  4. Réponses: 12
    Dernier message: 02/01/2008, 13h16
  5. Réponses: 2
    Dernier message: 26/01/2007, 14h58

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