Bonjour
J'ai un petit problème avec un split qui ne marche pas tout à faire normalement.
Voilà, je récupère le flux RSS de Allociné Du style,
"Séries TV > Vous voulez savoir ce qui s'est passé cette semaine sur la planète Séries ? Vous avez peur d'avoir raté une info ? Retrouvez ici le best-of de la semaine : toutes les grandes news publiées depuis lundi sur AlloCiné ! >> Lire tout l'article | sur AlloCiné - le Samedi 8 Novembre 2008"
Voilà mais le "Lire tout l'article | sur AlloCiné - le Samedi 8 Novembre 2008" ne m'intéresse pas, donc je fais un split du style
tcl
set var12 [split$line">>"]set finall [lindex$var120]
Mais le soucis, c'est qu'il me coupe aussi avec un seul ">", quand j'ai une phrase du style "blablabla >> Lire la suite...", il me retourne bien "blablabla" mais quand j'ai quelque chose du style "Séries TV > blablabla >> Lire la suite" Il me retourne que "Séries TV", alors qu'il devrait surpasser ce problème normalement .. ?
Bon, pour ton bonheur et parceque j'avais un peu de temps à perdre, je t'ai fais une fonction qui fait ce que tu recherches, je ne l'ai testée que brièvement, mais elle semble marcher. C'est documenter, si jamais ça t'intéresse.
tcl
proc my_split {chaine chars}{
# Scinde une chaine en liste, les séparateurs de la liste sont les # caractères donnés en arguments. Contrairement à [split] de Tcl, # cette procédure split sur tous les caractères.set chars_length [string length $chars]set chaine_length [string length $chaine]set i 0set result [list]while{$i<$chaine_length}{
# $current_chars_checked correspond aux X caractères à partir de la # position actuelle, X étant la taille des chars sur lesquels splitter. # # Concrètement, on vérifie que les X prochains caractères sont un # séparateur (spécifié dans $chars en paramètre)set current_chars_checked [string range $chaine$i[expr{$i + $chars_length - 1}]]set current_char [string index $chaine$i]
# Si c'est un séparateur, on ajoute $currentElement à la liste de sortie # $currentElement est une variable qui contient les caractères qui sont # lus, mais qui ne sont pas dans un séparateur.if{$current_chars_checked eq $chars}{
# On initialise la variable pour éviter toute erreur, car si on a # un séparateur dès le début, on a pas encore de lettres dans # la variable $currentElement.if{![info exists currentElement]}{set currentElement ""}
# On ajoute les derniers caractères lus avant d'avoir trouver le séparateur # à la liste de sortie, puis on efface $currentElement, de cette façon # les prochaines caractères lus qui ne sont pas un séparateur seront # ajouté dans une variable $currentElement qui est vierge.lappend result $currentElement
unset currentElement
# Enfin, on "saute" les X prochaines caractères puisque c'est un # séparateur, notre boucle continuera donc juste après le séparateur.incr i $chars_length}else{
# Si on est pas un séparateur, on ajoute le caractère lu à $currentElementappend currentElement $current_char
# Puis on passe à la lettre suivanteincr i
}}
# Il reste les derniers caractères lus dans $currentElement, on les ajoutent # à la variable de résultat, sinon il manquera toujours le dernier élémentlappend result $currentElement
# Puis on retourne la liste finale !return$result}
Ca marche exactement comme [split], sauf que ça considère tous les caractères passés en paramètres comme un seul séparateur.
Sinon, passer par une regexp serait peut-être plus simple non?
Lorsqu'on doit parcourir une chaîne de caractères comme ça, je ne sais pas si on y gagne en optimisation.