Communauté Eggdrop
Problème Split - Version imprimable

+- Communauté Eggdrop (https://forum.eggdrop.fr)
+-- Forum : Eggdrop et TCL (https://forum.eggdrop.fr/forumdisplay.php?fid=8)
+--- Forum : Scripts TCL (https://forum.eggdrop.fr/forumdisplay.php?fid=4)
+--- Sujet : Problème Split (/showthread.php?tid=300)



Problème Split - MewT - 08/11/2008

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


RE: Problème Split - Merwin - 08/11/2008

Je regarde ça jte tiens au courant


RE: Problème Split - Merwin - 08/11/2008

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.


RE: Problème Split - Merwin - 08/11/2008

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.


RE: Problème Split - Merwin - 08/11/2008

PS: Y a des chances que ça bug.


RE: Problème Split - MewT - 08/11/2008

Ouah Surprised Je pensais pas que c'était aussi compliqué de faire ça, enfin merci énormément ^^ Je vais tester ça de suite Wink


RE: Problème Split - Merwin - 09/11/2008

Ca marche?


RE: Problème Split - CrazyCat - 09/11/2008

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.


RE: Problème Split - Merwin - 09/11/2008

En effet, mais ça aurait été moin marrant pour moi Very Happy
Ceci dis t'as raison Smile