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 :

[csvread] Lire un fichier .csv avec séparateur ; et chaines de caractères


Sujet :

MATLAB

  1. #1
    Invité
    Invité(e)
    Par défaut [csvread] Lire un fichier .csv avec séparateur ; et chaines de caractères
    Bonjour,

    Je travaille actuellement sur un projet qui amène pas mal de soucis, dont voici les premiers :

    Je souhaiterais lire sous Matlab un fichier .csv enregistré sous mon PC suite à l'exécution d'un logiciel (le fichier est un output du logiciel).



    1. Premier problème : les .csv sont automatiquement enregistrés sous un format utilisant les ";" comme séparateurs ... Or csvread ne lit que les .csv utilisant des "," comme séparateurs.
    Comment changer les ";" en "," ?
    Ou comment utiliser csvread pour qu'il reconnaisse les ";" comme séparateurs, au lieu des "," ?




    2. Second problème : j'ai changé à la main tous les ";" d'un fichier .csv en "," mais csvread ne fonctionne toujours pas.
    Je tape
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    thin{1} = {'1293302.csv' [...]}
    [...]
    [data] = csvread(thin{1}{1},1,0,'A:J');
    et Matlab me renvoie
    ??? Attempted to access range(3); index out of bounds because numel(range)=0.
    
    Error in ==> dlmread at 108
        if r > range(3) || c > range(4), result= []; return, end
    
    Error in ==> csvread at 54
        m=dlmread(filename, ',', r, c, rng);


    Une idée du comment et du pourquoi ?

    Merci ;)
    Dernière modification par Invité ; 05/10/2011 à 13h49.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    1. Tu peux utiliser la fonction DLMREAD
    2. Attention aux notations possibles de l'entrée range de la fonction CSVREAD
      Citation Envoyé par doc csvread
      M = csvread(filename, row, col, range) reads only the range specified. Specify range using the notation [R1 C1 R2 C2] where (R1,C1) is the upper left corner of the data to be read and (R2,C2) is the lower right corner. You can also specify the range using spreadsheet notation, as in range = 'A1..B7'.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Eh bien, le problème est déjà dans dlmread. Du coup, l'utiliser à la place de csvread ne semble rien changer.

    En remplaçant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [data] = csvread(thin{1}{1},1,0,'A:J');
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [data] = dlmread(thin{1}{1},';','A:J');
    on obtient
    ??? Attempted to access range(1); index out of bounds because numel(range)=0.
    
    Error in ==> dlmread at 97
        r = range(1);

  4. #4
    Invité
    Invité(e)
    Par défaut
    Et qu'en est-il de mon deuxième point?
    Citation Envoyé par Winjerome Voir le message
    1. Attention aux notations possibles de l'entrée range de la fonction CSVREAD
      Citation Envoyé par doc csvread
      M = csvread(filename, row, col, range) reads only the range specified. Specify range using the notation [R1 C1 R2 C2] where (R1,C1) is the upper left corner of the data to be read and (R2,C2) is the lower right corner. You can also specify the range using spreadsheet notation, as in range = 'A1..B7' et non 'A:B'.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Au début, j'avais écrit 'A1:J7', et le problème était le même. Ecrire 'A:J' à la place n'a rien changé, l'erreur ne vient pas de là.
    De plus, je ne connaîs pas le nombre de lignes de mon fichier (je prends en entrée plusieurs fichiers successivement), donc je ne sais pas quel nombre je dois écrire après J ... Je veux juste faire en sorte que la colonne K (colonne de texte) ne soit pas lue.
    Je modifierais cette ligne par la suite si elle venait à poser problème.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par labtoy Voir le message
    Au début, j'avais écrit 'A1:J7', et le problème était le même.
    Un peu dur de la feuille hein?
    Donc au lieu de 'A1:J7' c'est 'A1..J7'
    Mais pour faire ce que tu veux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dlmread(thin{1}{1},';','A1..J:')

  7. #7
    Invité
    Invité(e)
    Par défaut
    Inutile d'être désagréable, surtout quand il s'agit seulement d'horizontaliser un ":" . . .

    Donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [data] = dlmread(thin{1}{1},';','A1..J:');
    me donne
    ??? Error using ==> dlmread at 145
    Mismatch between file and format string.
    Trouble reading number from file (row 1, field 1) ==> Area;
    "Area" étant A1, j'essaie donc à tout hasard
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [data] = dlmread(thin{1}{1},';','A2..J:');
    pour obtenir
    ??? Error using ==> dlmread at 145
    Mismatch between file and format string.
    Trouble reading number from file (row 1, field 11) ==> poro
    où "porosity" est le contenu de la colonne K à toutes les lignes.
    Remplacer "J" par "I" n'a aucun effet.

    PS : pour les "mous de feuille" mais dépourvus d'humour, je précise que le premier ainsi que le dernier commentaires de cette réponse sont ironiques . . .
    Je n'avais pas vu qu'il s'agissait d'un ".." et non pas d'un ":". Au temps pour moi, merci Winjerome.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Je ne voulais pas t'être désagréable, c'était ironique.
    Vu l'erreur, ton fichier n'est pas constitué de valeurs numériques mais de chaînes de caractères, et donc les fonctions DLMREAD et CSVREAD ne sont pas adaptées.

    Je te conseille de regarder la fonction TEXTSCAN.

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant:chaque jour on aprend des choses ;)
    Inscrit en
    Septembre 2011
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Espagne

    Informations professionnelles :
    Activité : Étudiant:chaque jour on aprend des choses ;)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2011
    Messages : 43
    Points : 68
    Points
    68
    Par défaut
    Bonjour,
    Ici un exemple de ce que tu cherches,labtoy.

    Contenu 'text.csv'
    valor1;valor2;valor3;
    1;2;yes;
    3;4;no;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    fid = fopen('test.csv');%Ouvrir fichier
    C = textscan(fid, '%s');%Lire comme array de strings
    fseek(fid, 0, 'bof');%reinitialiser le 'pointer'
    C = textscan(fid, repmat('%s ',1,length(strfind(C{1}{1},';'))),'Delimiter',';');% lecture formatee en colonnes
    fclose(fid);%Fermer fichier
    C=[C{:}];%Convertir en matrice de strings (array)
    Sortie
    C =

    'valor1' 'valor2' 'valor3'
    '1' '2' 'yes'
    '3' '4' 'no'
    Après tu devrait filtrer chaque colonnes pour les convertir en numerique si c'est le cas, ou filtrer l'entete pour chercher la colonne associée a une variable en concrete.

    Cordialement,

  10. #10
    Invité
    Invité(e)
    Par défaut
    Ne t'inquiète pas Winjerome, aucun souci :)

    Pour vous répondre à tous les deux d'un coup, je n'ai pas de prise sur le fichier .csv : je ne gère pas l'output du logiciel. Dans ce fichier, la première ligne et la dernière colonne (K) ont du texte dans chacune de leurs cellules. Mais ce texte ne m'est d'absolument aucune utilité, je ne tiens pas à le garder. De plus, j'aime autant simplifier mon code au maximum, et donc éviter les manoeuvres compliquées. Finalement, je voudrais juste utiliser csvread pour lire le fichier output de A2 à J: mais sans succès.

    Merci pour ton idée KR4ZY_GUI, j'y penserai (même si une solution plus simple est la bienvenue). Je trouve ça un peu capilotracté, parce que j'ai besoin d'exploiter ensuite les valeurs numériques que je lis à partir du .csv, ce qui peut peut être poser problème si elles sont entre " ". D'autant plus que comme expliqué plus haut, je n'ai pas besoin de garder les données texte.

    Merci à vous deux !

  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 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 : 53 166
    Points
    53 166
    Par défaut
    Citation Envoyé par labtoy Voir le message
    D'autant plus que comme expliqué plus haut, je n'ai pas besoin de garder les données texte.
    Dans ce cas, à partir de l'exemple donné par KR4ZY_GUI, tu peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fid = fopen('test.csv');
    X = textscan(fid,'%d%d%*s','delimiter',';','headerlines',1,'collectoutput',true);
    fclose(fid);
    Ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >> X{1}
     
    ans =
     
               1           2
               3           4
    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)

  12. #12
    Invité
    Invité(e)
    Par défaut
    Bon, eh bien après avoir jeté un oeil à doc textscan et avoir adapté le code conseillé par KR4ZY_GUI et Dut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        fid = fopen(file);
        data = textscan(fid,'%d%d%d%d%d%d%d%d%d%d%*s','delimiter',';','headerlines',1,'collectoutput',true);
        fclose(fid);
    où file est un nom de fichier, défini plus haut, j'obtiens ce que je voulais !

    Merci à tous !!
    A+

Discussions similaires

  1. [csvread] Fichier csv avec chaines de caractères
    Par bakaratoun dans le forum MATLAB
    Réponses: 4
    Dernier message: 20/10/2009, 03h19
  2. Lire fichier CSV avec tabulation comme séparation
    Par theNoob dans le forum Langage
    Réponses: 3
    Dernier message: 07/09/2009, 18h52
  3. Lire un fichier CSV envoyé avec une requête POST
    Par Marm B dans le forum Langage
    Réponses: 6
    Dernier message: 26/08/2009, 13h31
  4. [AC-2003] Lire un fichier CSV de 170Mo avec Access
    Par mmmxtina dans le forum VBA Access
    Réponses: 12
    Dernier message: 15/07/2009, 13h45
  5. Réponses: 12
    Dernier message: 12/04/2006, 10h20

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