OVH Cloud OVH Cloud

fonction split

4 réponses
Avatar
Marc Polidoro
Bonjour,
Je recherche un code de la fonction split() comme dans "awk" ou "perl"
Ou pourrais trouver cela SVP
Merci

4 réponses

Avatar
Alexandre
"Marc Polidoro" a écrit dans le message de news:
dfq1n6$3r5$
Bonjour,
Je recherche un code de la fonction split() comme dans "awk" ou "perl"
Ou pourrais trouver cela SVP
Merci
pour ceux qui ne connaissent ni awk ni perl à fond, qu'est-ce que cette

fonction est sensée faire ?

Avatar
Marc Polidoro
Bonsoir ci-joint un extrait des doc respectives (je n'ai pas eu le courage
de traduire excuse moi !!!)

Pour awk :
n = split(string, array, regexp)
splits string into fields. regexp is a regular expression giving the field
separator string for the purposes of this operation. This function assigns
the separate fields, in order, to the elements of array; subscripts for
array begin at 1. awk discards all other elements of array. split returns
the number of fields into which it divided string (which is also the maximum
subscript for array). regexp divides the record in the same way that the FS
field separator string does. If you omit regexp in the call to split, it
uses the current value of FS.

Pour Perl
split /PATTERN/,EXPR,LIMIT

split /PATTERN/,EXPR

split /PATTERN/

split

Splits the string EXPR into a list of strings and returns that list. By
default, empty leading fields are preserved, and empty trailing ones are
deleted. (If all fields are empty, they are considered to be trailing.)
In scalar context, returns the number of fields found and splits into the @_
array. Use of split in scalar context is deprecated, however, because it
clobbers your subroutine arguments.

If EXPR is omitted, splits the $_ string. If PATTERN is also omitted, splits
on whitespace (after skipping any leading whitespace). Anything matching
PATTERN is taken to be a delimiter separating the fields. (Note that the
delimiter may be longer than one character.)

If LIMIT is specified and positive, it represents the maximum number of
fields the EXPR will be split into, though the actual number of fields
returned depends on the number of times PATTERN matches within EXPR. If
LIMIT is unspecified or zero, trailing null fields are stripped (which
potential users of pop would do well to remember). If LIMIT is negative, it
is treated as if an arbitrarily large LIMIT had been specified. Note that
splitting an EXPR that evaluates to the empty string always returns the
empty list, regardless of the LIMIT specified.

A pattern matching the null string (not to be confused with a null pattern
//, which is just one member of the set of patterns matching a null string)
will split the value of EXPR into separate characters at each point it
matches that way. For example:

print join(':', split(/ */, 'hi there'));produces the output
'h:i:t:h:e:r:e'.


"Alexandre" a écrit dans le message de news:
4325cc59$0$23661$

"Marc Polidoro" a écrit dans le message de
news: dfq1n6$3r5$
Bonjour,
Je recherche un code de la fonction split() comme dans "awk" ou "perl"
Ou pourrais trouver cela SVP
Merci
pour ceux qui ne connaissent ni awk ni perl à fond, qu'est-ce que cette

fonction est sensée faire ?




Avatar
kanze
Marc Polidoro wrote:

Je recherche un code de la fonction split() comme dans "awk"
ou "perl" Ou pourrais trouver cela SVP


Plusieurs possibilités :

-- Dans la passée, j'avais une classe FieldArray, qui prenait
un std::string, et créer un std::vector< std::string >. Les
dernières versions utilisaient le modèle stratégie pour
déterminer comment découper la chaîne.

Pour l'instant, malheureusement, je n'ai pas de site Web, ce
qui veut dire que mon code n'est pas facilement disponible,
au moins qu'un site ailleurs en offre une copie. (J'avais
espéré cet été, mais je n'y suis pas arrivé.)

-- La bibliothèque OSE a une classe OTC_Record, qui fait à peu
près la même chose. Le seul problème éventuel, c'est que OSE
n'a pas encore été adapté à la bibliothèque standard ; il
utilise ses propres itérateurs et sa propre chaîne de
caractères. (En revanche, c'est une très belle bibliothèque,
bien supérieur à la STL à maints égards.)

-- Boost a une classe tokenizer. Je ne m'en suis pas encore
servi, mais d'après la documentation, elle a l'air moins
souple que ma classe (qui permet des expressions
rationnelles pour définir les separateurs). Comme mes
classes, elle a l'air d'utiliser le modèle stratégie (avec
la stragégie choisie par paramètre de template, donc lors de
la compilation, plutôt qu'à l'exécution). Ça veut dire qu'il
ne doit pas être trop difficile à ajouter des stratégies,
selon tes besoins.

Étant donné que mes classes ne sont pas disponibles pour
l'instant, je crois que la meilleur solution serait Boost,
malgré sa manque de souplesse.

--
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

Avatar
Aurelien Regat-Barrel
Bonjour,
Je recherche un code de la fonction split() comme dans "awk" ou "perl"
Ou pourrais trouver cela SVP


Je me risque à donner ce lien:
http://c.developpez.com/faq/cpp/?page=strings#STRING_tokens

Exemple de boost::tokenizer:


// découpe la chaine avec les séparateurs par défaut
void split( const std::string & Msg )
{
// utiliser le tokenizer par défaut
boost::tokenizer<> tok( Msg );

// itérer la séquence de tokens
for ( boost::tokenizer<>::const_iterator i = tok.begin();
i != tok.end();
++i )
{
// afficher chaque token extrait
std::cout << *i << 'n';
}
}

// découpe la chaine selon les séparateurs donnés
void split( const std::string & Msg, const std::string & Separators )
{
// typedef pour alléger l'écriture
typedef boost::tokenizer<boost::char_separator<char> > my_tok;

// séparateur personnalisé
boost::char_separator<char> sep( Separators.c_str() );

// construire le tokenizer personnalisé
my_tok tok( Msg, sep );

// itérer la séquence de tokens
for ( my_tok::const_iterator i = tok.begin();
i != tok.end();
++i )
{
// afficher chaque token extrait
std::cout << *i << 'n';
}
}

int main()
{
std::cout << "-- exemple 1 --n";

split( "mot1;mot2; ;mot3;;mot4;mot5;" );

std::cout << "-- exemple 2 --n";

split( "mot-compose1;mot,compose2;[mot][compose3];mot
compose4;<mot><compose><5>", ";" );
}

qui produit:

-- exemple 1 --
mot1
mot2
mot3
mot4
mot5
-- exemple 2 --
mot-compose1
mot,compose2
[mot][compose3]
mot compose4
<mot><compose><5>


:-)

--
Aurélien Regat-Barrel