Je dispose d'un fichier contenant des données utilisateur sur chaque ligne.
Pour lire ce fichier, j'ouvre un flux ifstream et récupère chaque champ
selon son type (entier, chaine, ...)
Cependant, certaines lignes ne respectent pas le meme format que les
autres en ce qui concerne les champs.
Autrement dit je dispose de ces deux types de formats :
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Michel Decima
In news:e669pm$4o2$, fanny Chevalier typed:
Bonjour,
Je dispose d'un fichier contenant des données utilisateur sur chaque ligne. Pour lire ce fichier, j'ouvre un flux ifstream et récupère chaque champ selon son type (entier, chaine, ...) Cependant, certaines lignes ne respectent pas le meme format que les autres en ce qui concerne les champs. Autrement dit je dispose de ces deux types de formats :
In news:e669pm$4o2$1@news.u-bordeaux1.fr,
fanny Chevalier <chevalie@labri.fr> typed:
Bonjour,
Je dispose d'un fichier contenant des données utilisateur sur chaque
ligne. Pour lire ce fichier, j'ouvre un flux ifstream et récupère
chaque champ selon son type (entier, chaine, ...)
Cependant, certaines lignes ne respectent pas le meme format que les
autres en ce qui concerne les champs.
Autrement dit je dispose de ces deux types de formats :
Je dispose d'un fichier contenant des données utilisateur sur chaque ligne. Pour lire ce fichier, j'ouvre un flux ifstream et récupère chaque champ selon son type (entier, chaine, ...) Cependant, certaines lignes ne respectent pas le meme format que les autres en ce qui concerne les champs. Autrement dit je dispose de ces deux types de formats :
On Wed, 7 Jun 2006 13:21:07 +0200, "Michel Decima" :
Lire les lignes une par une dans une chaine de caracteres,
Oui.
et ensuite traiter le contenu de la chaine avec un istringstream
Y'a pas à dire, les istream ne m'ont jamais inspiré.
En PHP, j'utiliserais les regex sans hésiter une seconde ; en C++, j'ai moins ce réflexe, mais ça peut tout de même être une bonne idée.
Michel Decima
In news:, Fabien LE LEZ typed:
On Wed, 7 Jun 2006 13:21:07 +0200, "Michel Decima" :
Lire les lignes une par une dans une chaine de caracteres,
Oui.
et ensuite traiter le contenu de la chaine avec un istringstream
Y'a pas à dire, les istream ne m'ont jamais inspiré.
En PHP, j'utiliserais les regex sans hésiter une seconde ; en C++, j'ai moins ce réflexe, mais ça peut tout de même être une bonne idée.
J'ai propose istringstream pour rester standard et ne pas trop 'perturber' le code original. Apres, c'est la complexite de traitement et la disponibilite des outils qui determine le choix (si on va jusqu'a Boost.Spirit, il faut aussi ajouter les competences du programmeur...)
In news:40hd82dhu6po8le66hglt2et6iuv8uriu2@4ax.com,
Fabien LE LEZ <gramster@gramster.com> typed:
On Wed, 7 Jun 2006 13:21:07 +0200, "Michel Decima"
<michel.decima@francetelecom.com>:
Lire les lignes une par une dans une chaine de caracteres,
Oui.
et ensuite
traiter le contenu de la chaine avec un istringstream
Y'a pas à dire, les istream ne m'ont jamais inspiré.
En PHP, j'utiliserais les regex sans hésiter une seconde ; en C++,
j'ai moins ce réflexe, mais ça peut tout de même être une bonne idée.
J'ai propose istringstream pour rester standard et ne pas trop 'perturber'
le code original. Apres, c'est la complexite de traitement et la
disponibilite
des outils qui determine le choix (si on va jusqu'a Boost.Spirit, il faut
aussi
ajouter les competences du programmeur...)
On Wed, 7 Jun 2006 13:21:07 +0200, "Michel Decima" :
Lire les lignes une par une dans une chaine de caracteres,
Oui.
et ensuite traiter le contenu de la chaine avec un istringstream
Y'a pas à dire, les istream ne m'ont jamais inspiré.
En PHP, j'utiliserais les regex sans hésiter une seconde ; en C++, j'ai moins ce réflexe, mais ça peut tout de même être une bonne idée.
J'ai propose istringstream pour rester standard et ne pas trop 'perturber' le code original. Apres, c'est la complexite de traitement et la disponibilite des outils qui determine le choix (si on va jusqu'a Boost.Spirit, il faut aussi ajouter les competences du programmeur...)
fanny Chevalier
Michel Decima wrote:
In news:, Fabien LE LEZ typed:
On Wed, 7 Jun 2006 13:21:07 +0200, "Michel Decima" :
Lire les lignes une par une dans une chaine de caracteres,
Oui.
et ensuite traiter le contenu de la chaine avec un istringstream
Y'a pas à dire, les istream ne m'ont jamais inspiré.
En PHP, j'utiliserais les regex sans hésiter une seconde ; en C++, j'ai moins ce réflexe, mais ça peut tout de même être une bonne idée.
J'ai propose istringstream pour rester standard et ne pas trop 'perturber' le code original. Apres, c'est la complexite de traitement et la disponibilite des outils qui determine le choix (si on va jusqu'a Boost.Spirit, il faut aussi ajouter les competences du programmeur...)
Merci pour votre aide, mais j'ai opté pour awk qui me rajoute le nombre de champs de chaque ligne en début de ligne Ainis, en testant cette valeur, je sais si la ligne comporte l'entier supplémentaire ou non.
awk '{print NF " " $0}' monFichier > copieFichier
Merci encore
Michel Decima wrote:
In news:40hd82dhu6po8le66hglt2et6iuv8uriu2@4ax.com,
Fabien LE LEZ <gramster@gramster.com> typed:
On Wed, 7 Jun 2006 13:21:07 +0200, "Michel Decima"
<michel.decima@francetelecom.com>:
Lire les lignes une par une dans une chaine de caracteres,
Oui.
et ensuite
traiter le contenu de la chaine avec un istringstream
Y'a pas à dire, les istream ne m'ont jamais inspiré.
En PHP, j'utiliserais les regex sans hésiter une seconde ; en C++,
j'ai moins ce réflexe, mais ça peut tout de même être une bonne idée.
J'ai propose istringstream pour rester standard et ne pas trop 'perturber'
le code original. Apres, c'est la complexite de traitement et la
disponibilite
des outils qui determine le choix (si on va jusqu'a Boost.Spirit, il faut
aussi
ajouter les competences du programmeur...)
Merci pour votre aide, mais j'ai opté pour awk qui me rajoute le nombre
de champs de chaque ligne en début de ligne
Ainis, en testant cette valeur, je sais si la ligne comporte l'entier
supplémentaire ou non.
On Wed, 7 Jun 2006 13:21:07 +0200, "Michel Decima" :
Lire les lignes une par une dans une chaine de caracteres,
Oui.
et ensuite traiter le contenu de la chaine avec un istringstream
Y'a pas à dire, les istream ne m'ont jamais inspiré.
En PHP, j'utiliserais les regex sans hésiter une seconde ; en C++, j'ai moins ce réflexe, mais ça peut tout de même être une bonne idée.
J'ai propose istringstream pour rester standard et ne pas trop 'perturber' le code original. Apres, c'est la complexite de traitement et la disponibilite des outils qui determine le choix (si on va jusqu'a Boost.Spirit, il faut aussi ajouter les competences du programmeur...)
Merci pour votre aide, mais j'ai opté pour awk qui me rajoute le nombre de champs de chaque ligne en début de ligne Ainis, en testant cette valeur, je sais si la ligne comporte l'entier supplémentaire ou non.
awk '{print NF " " $0}' monFichier > copieFichier
Merci encore
kanze
Fabien LE LEZ wrote:
On Wed, 7 Jun 2006 13:21:07 +0200, "Michel Decima" :
Lire les lignes une par une dans une chaine de caracteres,
Oui.
et ensuite traiter le contenu de la chaine avec un istringstream
Y'a pas à dire, les istream ne m'ont jamais inspiré.
Tout dépend de ce qu'il y a à faire, mais en général, si le nombre de champs varie, je crois que tu as raison. On peut le faire, ici, avec quelque chose du genre :
std::string line ; while ( std::getline( source, line ) ) { std::istringstream s( line ) ; std::vector< std::string > fields( (std::istream_iterator< std::string >( s )), (std::istream_iterator< std::string >()), std::back_inserter( fields ) ; switch ( fields.size() ) { case 4 : // Quatre champs ... break ;
case 5 : // Cinq champs ... break ;
default : // Erreur... break ; } }
Mais j'aurais plutôt tendance à utiliser ma classe FieldArray (à http://kanze.james.neuf.fr, j'espère).
En PHP, j'utiliserais les regex sans hésiter une seconde ; en C++, j'ai moins ce réflexe, mais ça peut tout de même être une bonne idée.
C'est aussi une solution. Moi-même, j'ai énormement l'habitude de AWK pour ce genre de chose. Au point que les toutes premières classes que j'ai écrites en C++, c'était pour faire des choses qu'on fait naturellement en AWK : String (naturellement, à l'époque), AssocArray (un tableau haché indexé par des String -- aujourd'hui avec le type d'index comme paramètre du template aussi), et FieldArray, qui découpe une chaîne en champs, selon un critère donné. Pendant longtemps, je me servais du modèle template et l'héritage pour choisir le critère ; aujourd'hui, c'est le modèle stratégie, mais dans les utilisations typiques, il n'y a pas de différence. Quelque chose comme ci-dessus
std::string line ; while ( std::getline( source, line ) ) { Gabi::BlankSeparatedFields fields( line ) ; // ... }
La véritable avantage, par rapport à la solution purement standard ci-dessus, c'est que par la suite, tu peux changer la définition de ce que c'est qu'un champ simplement en changeant le type de fields (ou en se servant de la classe de base, Gabi::FieldArray, et en fournissant toi-même le Splitter (le délégué qui fait le travail).
Sinon aussi, boost::regex offre pas mal de possibilités.
-- James Kanze GABI Software Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Fabien LE LEZ wrote:
On Wed, 7 Jun 2006 13:21:07 +0200, "Michel Decima"
<michel.decima@francetelecom.com>:
Lire les lignes une par une dans une chaine de caracteres,
Oui.
et ensuite traiter le contenu de la chaine avec un
istringstream
Y'a pas à dire, les istream ne m'ont jamais inspiré.
Tout dépend de ce qu'il y a à faire, mais en général, si le
nombre de champs varie, je crois que tu as raison. On peut le
faire, ici, avec quelque chose du genre :
std::string line ;
while ( std::getline( source, line ) ) {
std::istringstream s( line ) ;
std::vector< std::string >
fields(
(std::istream_iterator< std::string >( s )),
(std::istream_iterator< std::string >()),
std::back_inserter( fields ) ;
switch ( fields.size() ) {
case 4 :
// Quatre champs ...
break ;
case 5 :
// Cinq champs ...
break ;
default :
// Erreur...
break ;
}
}
Mais j'aurais plutôt tendance à utiliser ma classe FieldArray (à
http://kanze.james.neuf.fr, j'espère).
En PHP, j'utiliserais les regex sans hésiter une seconde ; en
C++, j'ai moins ce réflexe, mais ça peut tout de même être une
bonne idée.
C'est aussi une solution. Moi-même, j'ai énormement l'habitude
de AWK pour ce genre de chose. Au point que les toutes premières
classes que j'ai écrites en C++, c'était pour faire des choses
qu'on fait naturellement en AWK : String (naturellement, à
l'époque), AssocArray (un tableau haché indexé par des String --
aujourd'hui avec le type d'index comme paramètre du template
aussi), et FieldArray, qui découpe une chaîne en champs, selon
un critère donné. Pendant longtemps, je me servais du modèle
template et l'héritage pour choisir le critère ; aujourd'hui,
c'est le modèle stratégie, mais dans les utilisations typiques,
il n'y a pas de différence. Quelque chose comme ci-dessus
std::string line ;
while ( std::getline( source, line ) ) {
Gabi::BlankSeparatedFields
fields( line ) ;
// ...
}
La véritable avantage, par rapport à la solution purement
standard ci-dessus, c'est que par la suite, tu peux changer la
définition de ce que c'est qu'un champ simplement en changeant
le type de fields (ou en se servant de la classe de base,
Gabi::FieldArray, et en fournissant toi-même le Splitter (le
délégué qui fait le travail).
Sinon aussi, boost::regex offre pas mal de possibilités.
--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
On Wed, 7 Jun 2006 13:21:07 +0200, "Michel Decima" :
Lire les lignes une par une dans une chaine de caracteres,
Oui.
et ensuite traiter le contenu de la chaine avec un istringstream
Y'a pas à dire, les istream ne m'ont jamais inspiré.
Tout dépend de ce qu'il y a à faire, mais en général, si le nombre de champs varie, je crois que tu as raison. On peut le faire, ici, avec quelque chose du genre :
std::string line ; while ( std::getline( source, line ) ) { std::istringstream s( line ) ; std::vector< std::string > fields( (std::istream_iterator< std::string >( s )), (std::istream_iterator< std::string >()), std::back_inserter( fields ) ; switch ( fields.size() ) { case 4 : // Quatre champs ... break ;
case 5 : // Cinq champs ... break ;
default : // Erreur... break ; } }
Mais j'aurais plutôt tendance à utiliser ma classe FieldArray (à http://kanze.james.neuf.fr, j'espère).
En PHP, j'utiliserais les regex sans hésiter une seconde ; en C++, j'ai moins ce réflexe, mais ça peut tout de même être une bonne idée.
C'est aussi une solution. Moi-même, j'ai énormement l'habitude de AWK pour ce genre de chose. Au point que les toutes premières classes que j'ai écrites en C++, c'était pour faire des choses qu'on fait naturellement en AWK : String (naturellement, à l'époque), AssocArray (un tableau haché indexé par des String -- aujourd'hui avec le type d'index comme paramètre du template aussi), et FieldArray, qui découpe une chaîne en champs, selon un critère donné. Pendant longtemps, je me servais du modèle template et l'héritage pour choisir le critère ; aujourd'hui, c'est le modèle stratégie, mais dans les utilisations typiques, il n'y a pas de différence. Quelque chose comme ci-dessus
std::string line ; while ( std::getline( source, line ) ) { Gabi::BlankSeparatedFields fields( line ) ; // ... }
La véritable avantage, par rapport à la solution purement standard ci-dessus, c'est que par la suite, tu peux changer la définition de ce que c'est qu'un champ simplement en changeant le type de fields (ou en se servant de la classe de base, Gabi::FieldArray, et en fournissant toi-même le Splitter (le délégué qui fait le travail).
Sinon aussi, boost::regex offre pas mal de possibilités.
-- James Kanze GABI Software Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34