Communauté Eggdrop

Version complète : Problème Split
Vous consultez actuellement la version basse qualité d’un document. Voir la version complète avec le bon formatage.
Bonjour Smile
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 $var12 0]



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

Voilà, si quelqu'un peut m'aider Smile
Merci
Je regarde ça jte tiens au courant
Non c'est normal après vérification, comme expliqué sur l'exemple dans la documentation:

See how the split command splits on every character in splitChars, which can result in information loss if you are not careful:

tcl
split "alpha beta gamma" "temp"
      → al {ha b} {} {a ga} {} a



En fait, il lit la chaine, à chaque fois qu'il rencontre un caractère qui est dans la liste des caractères séparateurs, il cré un élément à la liste.

Tu ne dois pas voir ">>" comme une chaine, mais comme une énumération de caractères sur laquelle la chaine sera scindée.
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 0
    set 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 à $currentElement
            append currentElement $current_char
            
            # Puis on passe à la lettre suivante
            incr 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ément
    lappend 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.
PS: Y a des chances que ça bug.
Ouah Surprised Je pensais pas que c'était aussi compliqué de faire ça, enfin merci énormément ^^ Je vais tester ça de suite Wink
Ca marche?
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.
En effet, mais ça aurait été moin marrant pour moi Very Happy
Ceci dis t'as raison Smile