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 :

[csvwrite] Passage d'une colonne à une autre


Sujet :

MATLAB

  1. #1
    Membre expérimenté Avatar de lecteur1001
    Inscrit en
    Mai 2009
    Messages
    1 526
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 1 526
    Points : 1 554
    Points
    1 554
    Par défaut [csvwrite] Passage d'une colonne à une autre
    Bonjour,

    j'aurai besoin de créer un fichier CSV à partir de données Matlab et je n'y arrive pas correctement.
    Je souhaiterais avoir dans la 1ère colonne de ce fichier :
    1,2
    3,4
    et dans la seconde colonne de ce fichier :
    5,6
    7,8
    J'ai donc essayé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    A = {1 2; 3 4};csvwrite('test.csv',A,0,0)
    B = {5 6; 7 8};csvwrite('test.csv',B,0,1)
    mais j'obtiens uniquement dans la 1ère colonne :
    ,5,6
    ,7,8
    Comment faire pour passer à la seconde colonne ce fichier ?
    Merci de votre aide

  2. #2
    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
    Un fichier CSV n'a pas réellement de colonnes, c'est un fichier texte avec un délimiteur.

    De plus je pense que CSVWRITE n'ajoute pas mais écrase le fichier précédent.

    Pourrais-tu être plus clair sur ce que contiendra ton fichier au final ?
    (pour moi chacun de tes éléments a 2 colonnes donc au total ça en fait 4 et non pas 2 )

  3. #3
    Membre expérimenté Avatar de lecteur1001
    Inscrit en
    Mai 2009
    Messages
    1 526
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 1 526
    Points : 1 554
    Points
    1 554
    Par défaut
    Citation Envoyé par Caro-Line Voir le message
    Un fichier CSV n'a pas réellement de colonnes, c'est un fichier texte avec un délimiteur.

    De plus je pense que CSVWRITE n'ajoute pas mais écrase le fichier précédent.
    Mince... Ce serait donc impossible ?
    Serait-il possible de créer un fichier.xls puis ensuite de le renommer en .csv ?

    Citation Envoyé par Caro-Line Voir le message
    Pourrais-tu être plus clair sur ce que contiendra ton fichier au final ?
    (pour moi chacun de tes éléments a 2 colonnes donc au total ça en fait 4 et non pas 2 )
    Je ne vois pas comment être plus clair
    Effectivement, j'ai un deux éléments qui contiennent chacun deux valeurs séparées par des virgules.

    Ce que j'ai du mal à comprendre du coup, c'est à quoi correspondent les deux derniers paramètres de la fonction csvwrite ?

  4. #4
    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
    Citation Envoyé par lecteur1001 Voir le message
    Je ne vois pas comment être plus clair
    En montrant le fichier final.

    C'est ça que tu veux :
    1,2;5,6
    3,4;7,8
    ?

    Après il y a tout un tas d'autres fonctions d'écriture (XLSWRITE, FPRINTF...)

  5. #5
    Membre expérimenté Avatar de lecteur1001
    Inscrit en
    Mai 2009
    Messages
    1 526
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 1 526
    Points : 1 554
    Points
    1 554
    Par défaut
    Citation Envoyé par Caro-Line Voir le message
    En montrant le fichier final.
    Il se trouve en PJ (mais il faudrait que ce soit un .csv)

    Citation Envoyé par Caro-Line Voir le message
    Après il y a tout un tas d'autres fonctions d'écriture (XLSWRITE, FPRINTF...)
    Je suis justement en train d'essayer de faire ça avec xlswrite.
    Fichiers attachés Fichiers attachés

  6. #6
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Bonjour,

    dans ton fichier xls, je ne vois que 4 nombres réparties sur 2 lignes et 2 colonnes... Pourquoi ne pas faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    A = [1.2 5.6; 3.4 7.8];
    csvwrite('test.csv',A)
    ?

    Citation Envoyé par lecteur1001
    Ce que j'ai du mal à comprendre du coup, c'est à quoi correspondent les deux derniers paramètres de la fonction csvwrite ?
    Ils servent à ajouter des lignes et des colonnes vides dans le fichier csv.

  7. #7
    Membre expérimenté Avatar de lecteur1001
    Inscrit en
    Mai 2009
    Messages
    1 526
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 1 526
    Points : 1 554
    Points
    1 554
    Par défaut
    Citation Envoyé par magelan Voir le message
    dans ton fichier xls, je ne vois que 4 nombres réparties sur 2 lignes et 2 colonnes... Pourquoi ne pas faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    A = [1.2 5.6; 3.4 7.8];
    csvwrite('test.csv',A)
    ?
    En réalité, il s'agit de 8 nombres mais je souhaites qu'ils soient séparés par des virgules (comme le fait la fonction csvwrite). Je rappelle que je définis A et B comme étant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    A = [1 2; 3 4]
    B = [5 6; 7 8]
    Citation Envoyé par magelan Voir le message
    Ils servent à ajouter des lignes et des colonnes vides dans le fichier csv.
    D'accord, à faire un espèce d'offset depuis la 1ère colonne et la 1ère ligne quoi.

  8. #8
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Donc le fichier xls que tu nous as montré n'a rien à voir avec le problème

    Je répète le question de Caro-Line :
    que dois contenir précisément le fichier csv? Cela :
    1,2;5,6
    3,4;7,8
    ?
    ou peut-être cela :
    1,2,5,6
    3,4,7,8
    ?

    Un fichier csv est un fichier texte contenant des valeurs numériques séparées par des virgules, donc tu devrais pouvoir nous dire ce que doit contenir ce fichier...

  9. #9
    Membre expérimenté Avatar de lecteur1001
    Inscrit en
    Mai 2009
    Messages
    1 526
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 1 526
    Points : 1 554
    Points
    1 554
    Par défaut
    Excusez-moi, il est vrai que je m'explique mal depuis le début.
    Je vais être un peu plus précis que ce que je l'ai été jusqu'à présent. Disons que je définisse 3 vecteurs comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    A = [1;2;3;4];
    B = [5;6;7;8];
    C = [9;10;11;12];
    Je souhaiterais créer un fichier csv dont la 1ère colonne serait
    1,5
    2,6
    3,7
    4,8
    et donc la seconde colonne serait :
    1,9
    2,10
    3,11
    4,12
    Cela revient donc à concaténer A et B (séparés par une virgule) dans la 1ère colonne et concaténer A et C (aussi séparés par des virgules) dans la seconde colonne. Cela donnerait le fichier test.csv ci-joint (que j'ai renommé en .csv car impossible de joindre un fichier csv sur developpez.net).
    Pour le moment, je n'arrive qu'à créer que le fichier test2.csv ci-joint avec le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    A = [1;2;3;4];
    B = [5;6;7;8];
    csvwrite('test2.csv',[A B],0,0)
    J'espère avoir été assez clair cette fois.
    Merci de votre aide
    Fichiers attachés Fichiers attachés

  10. #10
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Pour information, ton fichier test.csv contient :

    1,5;1,9
    2,6;1,1
    3,7;1,11
    4,8;1,12
    Alors que je m'attendais à trouver :
    1,5;1,9
    2,6;2,10
    3,7;3,11
    4,8;4,12
    Enfin bref, tu ne peux peux pas utiliser csvwrite pour ce type d'écriture, la fonction n'est pas adaptée. Il faut passer par exemple par fprintf comme proposer par Caro-Line plus haut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    D = [1     5     1     9
         2     6     2    10
         3     7     3    11
         4     8     4    12];
    fid = fopen('test.csv','wt');
    fprintf(fid,'%d,%d;%d,%d\n',D');
    fclose(fid);

  11. #11
    Membre expérimenté Avatar de lecteur1001
    Inscrit en
    Mai 2009
    Messages
    1 526
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 1 526
    Points : 1 554
    Points
    1 554
    Par défaut
    Citation Envoyé par magelan Voir le message
    Alors que je m'attendais à trouver
    Excuse-moi, je sais que je n'ai pas été clair.

    Citation Envoyé par magelan Voir le message
    Enfin bref, tu ne peux peux pas utiliser csvwrite pour ce type d'écriture, la fonction n'est pas adaptée. Il faut passer par exemple par fprintf comme proposer par Caro-Line plus haut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    D = [1     5     1     9
         2     6     2    10
         3     7     3    11
         4     8     4    12];
    fid = fopen('test.csv','wt');
    fprintf(fid,'%d,%d;%d,%d\n',D');
    fclose(fid);
    Ah oui effectivement, ça fonctionne parfaitement !
    Par contre, là pour un exemple simple comme celui-là les vecteurs n'ont que 4 éléments. S'ils en 1000, je me vois mal taper 1000 "%d" ! Comment ferais-tu du coup ? Parce qu'avec un boucle for, ça n'a pas l'air simple...

    Dernière question : à quoi correspond le paramètre 't' quand tu utilises la fonction fopen ? w, pour write ; mais t ?

  12. #12
    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
    L'option t signifie text tout simplement, c'est expliqué dans l'aide de FOPEN.

    Pour créer ta chaîne de %d tu peux utiliser REPMAT.
    Exemple avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    format= repmat('%d,%d;',1,40);%on aura 2*40 éléments par ligne
    format(end) = [];%suppression du dernier ;
    format= [format,'\n'];%ajout du saut de ligne
    fid = fopen('test.csv','wt');
    fprintf(fid,format,D');
    fclose(fid);

  13. #13
    Membre expérimenté Avatar de lecteur1001
    Inscrit en
    Mai 2009
    Messages
    1 526
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 1 526
    Points : 1 554
    Points
    1 554
    Par défaut
    Citation Envoyé par Caro-Line Voir le message
    L'option t signifie text tout simplement, c'est expliqué dans l'aide de FOPEN.
    Merci de cette explication mais je ne trouve pas qu'elle soit très explicite dans la doc.
    Citation Envoyé par Caro-Line Voir le message
    Pour créer ta chaîne de %d tu peux utiliser REPMAT.
    Exemple avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    format= repmat('%d,%d;',1,40);%on aura 2*40 éléments par ligne
    format(end) = [];%suppression du dernier ;
    format= [format,'\n'];%ajout du saut de ligne
    fid = fopen('test.csv','wt');
    fprintf(fid,format,D');
    fclose(fid);
    Merci beaucoup de ce code ! J'ignorais l'existence de la fonction repmat. J'ignorais aussi qu'on pouvait concaténer des %d comme tu l'as fait, comme une simple chaîne de caractères.
    Merci donc encore pour tout ce code très instructif à mes yeux

  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 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 958
    Points
    52 958
    Par défaut
    Citation Envoyé par magelan Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fprintf(fid,'%d,%d;%d,%d\n',D');
    Dans le cas de valeurs non complexes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fprintf(fid,'%d,%d;%d,%d\n',D.');
    C'est normalement plus rapide...

    => : Quelle est la différence entre ' et .' ?

  15. #15
    Membre expérimenté Avatar de lecteur1001
    Inscrit en
    Mai 2009
    Messages
    1 526
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 1 526
    Points : 1 554
    Points
    1 554
    Par défaut
    Citation Envoyé par Dut Voir le message
    Dans le cas de valeurs non complexes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fprintf(fid,'%d,%d;%d,%d\n',D.');
    C'est normalement plus rapide...
    Citation Envoyé par lecteur1001 Voir le message
    Merci donc encore pour tout ce code très instructif à mes yeux
    Décidément, journée très instructive !

    Merci encore à tous

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 27/02/2021, 17h57
  2. MFC d'une colonne à une colonne et planning perpetuel
    Par mlegentil dans le forum Excel
    Réponses: 0
    Dernier message: 12/04/2014, 18h43
  3. Passage de paramètre d'une classe à une autre
    Par semenzato dans le forum C++
    Réponses: 3
    Dernier message: 21/09/2005, 14h59
  4. [C#] Passage de valeur d'une fenêtre à une autre
    Par groum999 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 13/09/2004, 15h12

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