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 :

Interpretation de la fontion parse_csv


Sujet :

C++

  1. #1
    Membre régulier
    Inscrit en
    Mars 2008
    Messages
    296
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 296
    Points : 103
    Points
    103
    Par défaut Interpretation de la fontion parse_csv
    bonjour,
    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    std::string	line; 
    int  line_no = 1;
    Fields   fields;
    while (std::getline(stream, line) && !line.empty())
    {
       parse_csv(line.begin(), line.end(), fields);
       ++line_no;
    }
    je viens de reprendre ce code et je voudrais comprendre ce que fait la fonction parse_csv(), a quoi correspond les parametres car j'ai vu qu'il est possible d'en ajouter d'autres.

    merci

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    327
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 327
    Points : 402
    Points
    402
    Par défaut
    Bonjour,
    Pour ma culture personnel, peux tu me dire ou tu as trouvé cette fonction ?
    Quel lib, le site ou tu l'as prise, ou autre.
    Merci
    A bientot

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    ce code ne tient pas compte qu'un champ peut s'ecrire sur plusieurs lignes
    encadré par des "

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    La fonction en question vient surement de l'utilisation d'une bibliothèque tierce, car elle n'existe absolument pas dans le standard.

    Ceci dit, sachant qu'un fichier CSV est composé de données séparées par des virgules, on peut *raisonnablement* estimer qu'elle aura pour but de récupérer les différentes valeurs en utilisant la virgule comme séparateur

    Selon le code, on peut également estimer qu'elle prend comme paramètre:
    • un itérateur sur le premier élément (caractère) de la chaine
    • un itérateur sur ce qui suit le dernier élément (caractèreà de la chaine
    • un objet dans lequel placer les différents éléments (vraisemblablement sous la forme d'une référence, pour que les modification apportées au sein de la fonction parse_csv soient répercutées dans la fonction appelante)

    Nous serions d'ailleurs presque en droit de nous poser la question de savoir pourquoi passer des itérateurs sur les différents caractères de la chaine plutôt que la chaine en elle-même, étant donné... que les données sont séparées par des virgules
    • Le code que tu fournis a pour objectif de
    • lire une à une toutes les lignes d'un fichier
    • faire traiter chacune de ces lignes par la fonction
    • compter le nombre de lignes lues

    Remarque:
    • Le nombre de lignes lues (line_no) correspond à la réalité +1, ce qui n'est peut être pas forcément l'idéal
    • && !line.empty() ne sert normalement à rien, étant donné que, si la fin du fichier est atteinte, getline renvoie faux et line est de toutes manière vide

    Pour pouvoir être plus précis, il faudrait des précisions concernant:
    • la déclaration de la fonction parse_csv
    • le code implémentant la fonction
    • la définition du type Fields
    Mais tu aura remarqué qu'il y a pas mal de remarques à faire sur ce code, et que, d'une certaine manière, il ne serait pas étonnant outre mesure de se rendre compte que le comportement n'est pas forcément celui attendu
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    && !line.empty() ne sert normalement à rien, étant donné que, si la fin du fichier est atteinte, getline renvoie faux et line est de toutes manière vide
    Pas tout à fait. J'ai déjà vu des csv avec une sorte de "signature" en fin de fichier, séparée des données par une ligne vide. C'est intéressant de virer cette signature.

    Comme csv n'est pas normé correctement, on trouve de tout et surtout du n'importe quoi.

    Sinon, même remarque qu'epsilon68, une ligne de csv peut être multiligne.

  6. #6
    Membre régulier
    Inscrit en
    Mars 2008
    Messages
    296
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 296
    Points : 103
    Points
    103
    Par défaut
    bonjour,

    je viens de trouver la fonction parse_csv
    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
    template <typename InputIt, typename Container>
    size_t parse_csv(InputIt first, InputIt last, Container& match, char separator = ',', char quote = '\"')
    {
    	enum {	buf_size = 256 };
     
    	match.clear();
     
    	bool	in_quote = false;
    	char	buf[buf_size];
    	char*	pbase = &buf[0];			// pointer to the beginning of the output buffer.
    	char*	pptr  = pbase;				// pointer to the next element of the output buffer.
    	char*	epptr = pbase + buf_size;	// pointer just past the end of the output buffer.
     
    	while (first != last)
    	{
    		char	ch = *first++;
     
    		if (ch == quote)
    		{
    			in_quote = !in_quote;
    			continue;
    		}
     
    		if (ch == separator && !in_quote)
    		{
    			std::string::size_type	size = pptr - pbase;
    			match.push_back(std::string(pbase, size));
    			pptr = pbase;
    		}
    		else
    		if (pptr == epptr)
    			continue;	//overflow -> troncature
    		else
    			*pptr++ = ch;
    	}
     
    	std::string::size_type	size = pptr - pbase;
    	match.push_back(std::string(pbase, size));
     
    	return match.size();
    }
    est ce que quelqu'un peux me dire ce qui est fait la dedans

    merci

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    327
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 327
    Points : 402
    Points
    402
    Par défaut
    Bonjour,
    La fonction en question vient surement de l'utilisation d'une bibliothèque tierce, car elle n'existe absolument pas dans le standard.
    Merci pour ta réponse. Je me douté qu'elle n'existait pas en standard mais ça confirme ce que je pensais.
    Je pense que la fonction est tellement facile à implémenter que si tu ne maitrises pas cette bibliothèque. Il vaut mieux que l'implémente toi à moins que dans les spécifications il y ait une instruction qui t'oblige à l'utilisé.
    A bientôt.

Discussions similaires

  1. pb interpretation php
    Par baps dans le forum Apache
    Réponses: 9
    Dernier message: 07/06/2006, 14h56
  2. interpretation d'un boolean
    Par voyageur37 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 19/11/2004, 10h51
  3. [Reflection] Interpreter une chaine en une methode java
    Par shaun_the_sheep dans le forum API standards et tierces
    Réponses: 6
    Dernier message: 09/10/2004, 15h11
  4. [XSL][re] Ecrire des balise qui ne seront pas interpretées
    Par FrRoulio dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 17/03/2004, 12h32
  5. Réponses: 3
    Dernier message: 07/04/2003, 20h06

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