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

 C Discussion :

Couper chaine de caractères selon ";"


Sujet :

C

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 129
    Par défaut Couper chaine de caractères selon ";"
    Bonjour,
    Je cherche à récupérer des données d'un fichier CSV et donc de couper les infos selon les ";". Mon tableau fait 4 lignes sur 100.
    J'ai essayé avec fscanf mais les espaces coupent mes variables.

    Y'a t'il une fonction pour découper selon les ";" en incluant les espaces ?

    Merci beaucoup

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 527
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 527
    Par défaut
    Bonjour,

    Regarde du côté de fgets() et strtok().

    Bon courage.

  3. #3
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Citation Envoyé par lmplmp Voir le message
    J'ai essayé avec fscanf mais les espaces coupent mes variables.

    Y'a t'il une fonction pour découper selon les ";" en incluant les espaces ?
    C'est parce que tu ne te sers pas bien de cette fonction. Regarde ce tuto, il t'explique bien comment recuperer ce qui t'interesse : http://xrenault.developpez.com/tutoriels/c/scanf/
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 129
    Par défaut
    Citation Envoyé par gangsoleil Voir le message
    C'est parce que tu ne te sers pas bien de cette fonction. Regarde ce tuto, il t'explique bien comment recuperer ce qui t'interesse : http://xrenault.developpez.com/tutoriels/c/scanf/
    L'ennui c'est que les longueurs de mes chaines sont variables.

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 129
    Par défaut Lire un fichier CSV ligne par ligne, espaces compris
    Voila le code, ca fonctionne:



    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    int main() {
     
     
     
    int i=0;
    char ligne[3000];
    char titre[200]="test";
    char *logo;
    char *prenom;
    char *nom;
    char *fonction1;
    int nb_l = 0;
    char c={0};
    char *ptr;
     
     
    FILE* file_in; /* stream associated to filename */
    file_in = fopen ("fichieraconvertir.csv", "r");
     
    if (file_in == NULL)
    {
        printf("Fichier introuvable");
        return(0);
    }
     
    /* nb_lines contains the number of lines in the file */
     
    while ((c=getc(file_in)) != EOF) //on compte les retours à la ligne jusqu'a la fin du fichier
    {
    if (c=='\n')
      {
          nb_l++;
      }
    }
    fclose(file_in);
     
     
    printf("nombre de lignes: %d \n", nb_l);
     system("pause");
     
     
     
     
     
     
     
    FILE *fichieroriginal=NULL;
    fichieroriginal=fopen("fichieraconvertir.csv","r");
     
    if(fichieroriginal==NULL) {
    printf("Erreur de fichier");
    return 0;
                  }
     
     
     
     
    //j'ai trois colonnes à retranscrire pour nb_l lignes
     
    while(i<nb_l)
    {
     
    fgets(ligne, 3000, fichieroriginal); // on recupere une ligne du fichier
     
    logo=strtok(ligne,";");
    printf("logo: %s \n", logo);
    printf("ligne restante: %s", ligne);
     
    prenom=strtok(NULL,";");
    printf("prenom: %s", prenom);
     
    nom=strtok(NULL,";");
    printf("nom: %s", nom);
     
    fonction1=strtok(NULL,";");
    printf("fonction1: %s", fonction1);
     
     
     
    system("pause");
     
     
    i++;
     
    }
     
    return 0;
    }

    Merci beaucoup

  6. #6
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Citation Envoyé par lmplmp Voir le message
    L'ennui c'est que les longueurs de mes chaines sont variables.
    Elles ont bien une taille maximale, non ?

    Et si c'est 3000, comme dans ton exemple, ca donne (attention, code sans verification, il faut peut-etre echapper le ; ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fscanf (file, "%3000[^;];%3000[^;];%3000[^;];%3000[^;];", &logo, &prenom, &nom, &fonction);
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 129
    Par défaut
    Les problèmes se suivent et ne se ressemblent pas...

    Suivant le code suivant je cherche à concaténer prenom et nom, mais rien ne plante et rien ne fonctionne vraiment.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    prenom=strcat(prenom,nom);
    printf("%s",prenom); donne jean
    printf("%s",nom); donne dupont

    Rien de sorcier sauf que quand j'affiche prenom apres concatenation... j obtiens "jean"

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 129
    Par défaut
    Citation Envoyé par gangsoleil Voir le message
    Elles ont bien une taille maximale, non ?

    Et si c'est 3000, comme dans ton exemple, ca donne (attention, code sans verification, il faut peut-etre echapper le ; ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fscanf (file, "%3000[^;];%3000[^;];%3000[^;];%3000[^;];", &logo, &prenom, &nom, &fonction);
    Ca fait planter le prog ><

  9. #9
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Citation Envoyé par lmplmp Voir le message
    Suivant le code suivant je cherche à concaténer prenom et nom, mais rien ne plante et rien ne fonctionne vraiment.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    prenom=strcat(prenom,nom);
    printf("%s",prenom); donne jean
    printf("%s",nom); donne dupont

    Rien de sorcier sauf que quand j'affiche prenom apres concatenation... j obtiens "jean"
    Alors, on sort la boule de cristal, et on te propose les hypotheses suivantes :
    tu as declare : char prenom[300]="jean"; Manque de pot, prenom est dans ce cas non modifiable.
    tu utilises strncat, avec une taille de 4 pour prenom, et donc ca ne fonctionne pas.

    D'ailleurs, tu devrais utiliser strncat.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 129
    Par défaut
    Citation Envoyé par gangsoleil Voir le message
    Alors, on sort la boule de cristal, et on te propose les hypotheses suivantes :
    tu as declare : char prenom[300]="jean"; Manque de pot, prenom est dans ce cas non modifiable.
    tu utilises strncat, avec une taille de 4 pour prenom, et donc ca ne fonctionne pas.

    D'ailleurs, tu devrais utiliser strncat.

    Tout mon programme est au dessus, merci de ta divination, je vais explorer cette voie.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 129
    Par défaut
    Donc j'ai fait:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    prenom=strncat(prenom,nom,strlen(nom));
    et ca ne concatene toujours rien...

  12. #12
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Bonjour,

    Tu ne comprends pas les fonctions que tu utilises, c'est pour ca que tu n'obtiens pas ce que tu veux.

    strtok ne fait pas ce que tu crois : prenom est un pointeur sur une des cases du tableau ligne, ce n'est pas une "chaine de caracteres".

    strncat (char *restrict s1, const char *restrict s2, size_t n);
    Cette fonction ajoute au plus n caracteres de s2 dans s1. Est-ce que tu crois que c'est la taille de s2 qu'il faut passer, ou bien la taille de s1 diminuee du nombre de caracteres que contient cette chaine ?

    Est-ce que tu testes le code de retour de strcat ? En cas d'erreur, que vaut errno ?
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  13. #13
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Citation Envoyé par lmplmp Voir le message
    Ca fait planter le prog ><
    Ou ? Quelle est l'erreur ? As-tu verifie s'il fallait ou non echapper le caractere ';' ? Est-ce que tu essayes de travailler un peu par toi-meme, ou bien attends-tu que l'on te donne la reponse sans que tu comprennes ?
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 129
    Par défaut
    J'ai converti le pointeur en tableau.
    Il est vrai que je connais mal fscanf, je n'ai d ailleurs pas compris ce que tu voulais dire par échapper, j'ai essayer quelques alternatives mais rien n'a fonctionné.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    j=0;
    fgets(ligne, 3000, fichieroriginal); // on recupere une ligne du fichier
     
    logo=strtok(ligne,";");
     
    longueur=strlen(logo);
    while(j<longueur){
    logotab[j]=*(logo+j);
    j++;
    }

    J'avais fait une erreur d'étourderie, ca fonctionne. Merci beaucoup

  15. #15
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 498
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par gangsoleil Voir le message
    tu as declare : char prenom[300]="jean"; Manque de pot, prenom est dans ce cas non modifiable.
    Qu'entends tu par là ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        char prenom[300]="jean";
        prenom[0] = 'J';
        strcat(prenom, " du jardin");
    reste possible par exemple.

    je n'ai d ailleurs pas compris ce que tu voulais dire par échapper
    Dans ce cas il faut demander gentiment au lieu de dire méchamment que ça ne marche pas...

  16. #16
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Qu'entends tu par là ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        char prenom[300]="jean";
        prenom[0] = 'J';
        strcat(prenom, " du jardin");
    reste possible par exemple.
    Bah oui, mais si tu ne corriges pas mes conneries aussi

    le code qui doit poser probleme (mais je suis fatigue, donc il est possible que lui aussi ait besoin de correction) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        char * prenom="jean";
        prenom[0] = 'J';
        strcat(prenom, " du jardin");
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  17. #17
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 498
    Billets dans le blog
    1
    Par défaut
    Ah ! Dis comme ça je valide sans essayer de compiler ^^

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

Discussions similaires

  1. Comment récupérer une chaine de caractère selon son début et sa fin?
    Par neo62matrix dans le forum Général Python
    Réponses: 3
    Dernier message: 21/03/2012, 11h08
  2. Tri dans chaine de caractères selon style police de texte
    Par malabarbe dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 22/09/2008, 15h44
  3. Tri d'une Chaine de Caractère selon un Critère
    Par compte dans le forum Langage
    Réponses: 10
    Dernier message: 24/01/2008, 16h57
  4. Réponses: 8
    Dernier message: 24/07/2007, 14h39
  5. [PL/SQL] Chaine de caractères avec une quote
    Par Titouf dans le forum Oracle
    Réponses: 2
    Dernier message: 15/05/2006, 15h36

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