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 :

Lire un fichier CSV dont les données contiennent des points


Sujet :

MATLAB

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    49
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2010
    Messages : 49
    Points : 21
    Points
    21
    Par défaut Lire un fichier CSV dont les données contiennent des points
    Bonjour,

    Voila j'ai un soucis concernant la lecture de fichiers CSV contenant des données avec des points. Par exemple Matlab n'arrivera pas à lire 0.26002401 mais réussiera à lire 0,26002401.

    Existe-il une solution autre que changer manuellement les points en virgules sous Excel ?(Nombreux fichiers de 20 000 lignes chacuns)

    Merci d'avance

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 640
    Points : 776
    Points
    776
    Par défaut
    Salut,

    regarde cette discussion, le problème y est traité. Il faut modifier le fichier avant lecture.

    http://www.developpez.net/forums/d72...e-fichier-csv/

    Bout de code...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    fid = fopen('test.csv', 'rt');
    car = fread(fid);
    fclose(fid);
     
    data = strrep(char(car'), '.', ',')

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    49
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2010
    Messages : 49
    Points : 21
    Points
    21
    Par défaut
    Merci pour ta réponse Merel

  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 307
    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 307
    Points : 52 888
    Points
    52 888
    Par défaut
    Citation Envoyé par black cat747 Voir le message
    Par exemple Matlab n'arrivera pas à lire 0.26002401 mais réussiera à lire 0,26002401.
    Bizarre... j'aurais exactement dis l'inverse

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 640
    Points : 776
    Points
    776
    Par défaut
    Je pensais aussi à la même chose en répondant hier. Surement une inversion ;-)

  6. #6
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 307
    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 307
    Points : 52 888
    Points
    52 888
    Par défaut
    [Edit] Téléchargez une nouvelle version de cette fonction ici

    Je croyais l'avoir déjà fait mais voici une petite fonction qui remplace n'importe quel caractère (ou chaine de caractères) dans un fichier :
    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
    function repinfile(fname,C,R)
     
    error(nargchk(3,3,nargin));
     
    C = cellstr(C);
    R = cellstr(R);
     
    if numel(C)~=numel(R)
        error('Number of characters to replace must match in both entries');
    end
     
    fid = fopen(fname,'r');
        if fid==-1,error('Unable to open "%s"',fname);end
        X = fread(fid);
    fclose(fid);
     
    for n=1:numel(C)
        X = strrep(X,C{n},R{n});
    end
     
    [pname,fname,ext] = fileparts(fname);
    fname = ['new_' fname ext];
     
    fid = fopen(fullfile(pname,fname),'w');
        if fid==-1,error('Unable to open "%s"',fname);end
        fwrite(fid,X);
    fclose(fid);
    C et R contiennent respectivement les caractères à remplacer et les caractères de remplacement.

    Par exemple avec le fichier text.txt suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    1000000000:0,26002401:-0,37121576:0,087076373:0,18218841:-0,021071654:-0,19434173
    1000050000:0,36562258:-0,35560846:0,32496661:0,20820148:-0,083624341:-0,073706456
    1000100000:0,41557035:-0,59559822:0,51841128:0,084070481:0,03251845:-0,029845467
    Si l'on souhaite remplacer les deux points ":" par des virgules "," et les virgules "," par des points "."
    :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    repinfile('test.txt',{',',':'},{'.',','})
    donne le fichier new_test.txt suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    1000000000,0.26002401,-0.37121576,0.087076373,0.18218841,-0.021071654,-0.19434173
    1000050000,0.36562258,-0.35560846,0.32496661,0.20820148,-0.083624341,-0.073706456
    1000100000,0.41557035,-0.59559822,0.51841128,0.084070481,0.03251845,-0.029845467
    Il faut faire attention à l'ordre des remplacements.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    repinfile('test.txt',{':',','},{',','.'})
    aurait donné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    1000000000.0.26002401.-0.37121576.0.087076373.0.18218841.-0.021071654.-0.19434173
    1000050000.0.36562258.-0.35560846.0.32496661.0.20820148.-0.083624341.-0.073706456
    1000100000.0.41557035.-0.59559822.0.51841128.0.084070481.0.03251845.-0.029845467


    J'essaierai de poster une version améliorée dans le forum Contribuez

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    49
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2010
    Messages : 49
    Points : 21
    Points
    21
    Par défaut
    Je n'ai pas fait d'inversion dans ma phrase...oops
    En fait à la base je dispose d'un fichier CSV dont les valeurs sont triées par colonnes et dont les nombres décimaux sont séparés par des points. Lorsque je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    data=xlsread('C:\Documents and Settings\th\Bureau\Picaros3 thème 3\Etude1phase1\etude11deg0.csv');
    Matlab m'affiche seulement la première colonne, la seule à ne pas avoir de nombre décimaux...du coup je me suis dit que cela venait des points

  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 307
    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 307
    Points : 52 888
    Points
    52 888
    Par défaut
    Citation Envoyé par black cat747 Voir le message
    En fait à la base je dispose d'un fichier CSV dont les valeurs sont triées par colonnes et dont les nombres décimaux sont séparés par des points.
    Tu pourrais nous montrer quelques lignes de ce fichier ?

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    49
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2010
    Messages : 49
    Points : 21
    Points
    21
    Par défaut
    Biensur

    Par contre j'ai du le mettre en .xls pour le joindre au message mais à l'origine c'est un .csv
    Fichiers attachés Fichiers attachés

  10. #10
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 307
    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 307
    Points : 52 888
    Points
    52 888
    Par défaut
    Citation Envoyé par black cat747 Voir le message
    Par contre j'ai du le mettre en .xls pour le joindre au message mais à l'origine c'est un .csv
    Mets plutôt le fichier csv dans une archive zip ou rar

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    49
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2010
    Messages : 49
    Points : 21
    Points
    21
    Par défaut
    Voici
    Fichiers attachés Fichiers attachés

  12. #12
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 307
    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 307
    Points : 52 888
    Points
    52 888
    Par défaut
    Les valeurs numériques contenues dans ce fichier se lisent simplement en faisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    X = dlmread('etude11deg0.csv',';',6,0)

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    49
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2010
    Messages : 49
    Points : 21
    Points
    21
    Par défaut
    Merci beaucoup pour ta réponse !

    Par contre j'ai un petit problème, lorsque j'execute ta commande sur le fichier raccourci sa marche très bien mais lorsque je le fais sur le "vrai" fichier il me met une erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ??? Error using ==> textscan
    Mismatch between file and format string.
    Trouble reading number from file (row 20002, field 1) ==> E
     
    Error in ==> test at 20
    X = dlmread('C:\Documents and Settings\th\Bureau\etude11deg0.csv',';',8,0);
    ET quand j'écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    X = dlmread('C:\Documents and Settings\th\Bureau\etude11deg0.csv',';',8,1);
    sa fonctionne...comme s'il n'arrivait plus a lire la première colonne...étrange

  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 307
    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 307
    Points : 52 888
    Points
    52 888
    Par défaut
    Tu pourrais nous montrer quelques lignes avant et après la ligne 20002 dans le fichier ?

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    49
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2010
    Messages : 49
    Points : 21
    Points
    21
    Par défaut
    Voila
    Le fichier se termine à la ligne 20009 par "END"
    Fichiers attachés Fichiers attachés

  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 307
    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 307
    Points : 52 888
    Points
    52 888
    Par défaut
    Citation Envoyé par black cat747 Voir le message
    Le fichier se termine à la ligne 20009 par "END"
    Ah ben oui... mais non.

    On peut donc combiner les deux solutions contenues dans cette discussion :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    repinfile('etude11deg0.csv','END','')
    X = dlmread('new_etude11deg0.csv',';',6,0);
    ou alors utiliser directement TEXTSCAN :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    fid = fopen('etude11deg0.csv');
        X = textscan(fid,'%d%f%f%f%f%f%f','delimiter',';', ...
            'headerlines',6,'ReturnOnError',true);
    fclose(fid);
    ou encore pour récupérer un tableau de cellule avec une seule cellule contenant toutes les données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    fid = fopen('etude11deg0.csv');
        X = textscan(fid,'%f%f%f%f%f%f%f','delimiter',';', ...
            'headerlines',6,'CollectOutput',true,'ReturnOnError',true);
    fclose(fid);

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    49
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2010
    Messages : 49
    Points : 21
    Points
    21
    Par défaut
    Merci !

    Est-il possible de faire une boucle pour lire plusieurs fichiers ?
    du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for deg=0:12:348
        deg = num2str(deg);
        repinfile(strcat('C:\Documents and Settings\th\Bureau\Picaros3 thème 3\Etude1phase1\etude11deg',deg,'.csv','END',''));
        data = dlmread('new_etude11deg',deg,'.csv',';',8,0);
    end

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/09/2014, 22h28
  2. Réponses: 2
    Dernier message: 20/02/2012, 09h29
  3. Réponses: 3
    Dernier message: 02/07/2008, 10h44
  4. Réponses: 1
    Dernier message: 26/01/2007, 08h15
  5. Réponses: 4
    Dernier message: 15/08/2006, 17h40

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