Partage
  • Partager sur Facebook
  • Partager sur Twitter

question débutant : séparer une ligne

    28 octobre 2011 à 18:15:05

    Salut,

    dans un tuto, on nous montre comment séparer les éléments d'une ligne, et notamment le nom entre guillemets qui est séparé par une virgule.

    mais je ne comprends pas un truc, le nom entre guillemets est censé ne faire "qu ' un ", alors que j'ai l'impression qu'ici on le sépare :

    Voilà le code :

    la ligne à couper : "La Jolla Bank, FSB",La Jolla,CA,32423,19-Feb-10,24-Feb-10
    
    
    def mysplit (string):
        quote = False
        retval = []
        current = ""
        for char in string:
            if char == '"':
                quote = not quote //est-ce léquivalent de quote = !quote, donc quote = true?
            elif char == ',' and not quote:
                retval.append(current) 
                current = "" //si on vide current, on sépare le nom entre guillemets, non?
            else:
                current += char
        retval.append(current)
        return retval
    


    on se sert de ce code pour cibler les dates, en "4" et en "5" :

    # Read lines from file, skipping first line
    data = open("banklist.csv", "r").readlines()[1:]
    for entry in data:
        # Parse values
        vals = mysplit(entry.strip())
        # Convert dates to sqlite3 standard format
        vals[4] = datetime.strptime(vals[4], "%d-%b-%y")
        vals[5] = datetime.strptime(vals[5], "%d-%b-%y")
    




    Merci
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      28 octobre 2011 à 18:34:23

      Il faudrait être un peu plus explicite j'ai pas tout compris.

      Tu as un fichier csv qui te donne un résultat quand tu l'ouvres.

      Déjà il faut savoir qu'il existe un module qui se nomme csv et qui permet de travailler plus facilement avec ton cas de figure.

      Ensuite tu crées une fonction mysplit, ce qui serait bien pour vérifier ton code c'est d'avoir un exemple d'entrée sortie.

      string est donc une chaine, tu peux utiliser la méthode split() pour découper à chaque espace trouvé.

      "ma chaine découpée".split()
      


      • Partager sur Facebook
      • Partager sur Twitter
        28 octobre 2011 à 20:44:35

        en fait, on est censé découper la ligne avec le séparateur "virgule", mais ce qui se trouve entre guillemets doit être considéré comme un nom, et non deux, pour que quand on récupère chaque ligne, on trouve en position 4 et 5 les dates à la fin de la ligne (si j'ai bien compris) : je remet la ligne à couper :

        Citation

        "La Jolla Bank, FSB",La Jolla,CA,32423,19-Feb-10,24-Feb-10



        voilà l'url : http://www.raywenderlich.com/902/sqlit [...] and-scripting

        donc je suis un peu brouillé par le "not quote" : quand on tombe sur le premier guillemet, on met "not quote" à quote qui est déjà à false. et ensuite on vérifie qu'on est à "not quote" et si on tombe sur une virgule on met le mot dans le tableau. Donc j'ai l'impression qu'on coup aussi le mot entre guillements. (ce qui n'est au final apparemment pas le cas, car le code vient du tuto, ce n'est pas moi qui l'ai écrit) Tu vois ce que je veux dire?
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          28 octobre 2011 à 22:26:41

          Si quote vaut True alors not quote vaut False, et inversement. Dans le code cité ci-dessus, quote est utilisé comme un interrupteur; un coup il est défini comme vrai quand le caractère courant est un guillemet puis faux au suivant. Ainsi de suite. C'est pas plus compliqué que ça.
          • Partager sur Facebook
          • Partager sur Twitter
            30 octobre 2011 à 12:02:35

            salut, oui j'imagine bien que c'est ça, mais c'est dans la condition que je m'y perds un peu :

            if char == '"':
                        quote = not quote
                    elif char == ',' and not quote:
                        retval.append(current) 
                        current = "" #si on vide current, on sépare le nom entre guillemets, non?
                    else:
                        current += char
            


            "and not quote" ici veut dire "and quote == false"?
            dans ce cas, on saute le elif et on va directement au else sans vider current donc sans couper le mot.

            Mais j'ai l'impression de lire "and not quote" comme "and l'inverse quote" qui est à false lorsqu'il est déclaré, donc quote == true,
            et la condition est remplie (la virgule + quote à true) et on coupe le mot en vidant current...
            (or, une fois qu'on a passé le premier guillemet, on ne doit pas couper les mots entre virgules)
            • Partager sur Facebook
            • Partager sur Twitter
              30 octobre 2011 à 12:15:15

              Citation

              "La Jolla Bank, FSB",La Jolla,CA,32423,19-Feb-10,24-Feb-10



              si toutes les chaines à découper on cette forme, je ne voit pas le problème ...

              >>> chaine = '"La Jolla Bank, FSB",La Jolla,CA,32423,19-Feb-10,24-Feb-10'
              >>> nom,autre = chaine.split('"')[1:]
              >>> nom
              'La Jolla Bank, FSB'
              >>> autre.split(',')[1:]
              ['La Jolla', 'CA', '32423', '19-Feb-10', '24-Feb-10']
              

              • Partager sur Facebook
              • Partager sur Twitter

              Python c'est bon, mangez-en. 

                30 octobre 2011 à 21:44:21

                Y'a effectivement une manière bien plus simple d'arriver à ton résultat comme viens de le préciser josmiley. Si tu tiens à le coder toi-même alors je vais essayer de détaillé ton code pour t'éclairer :p :
                def mysplit(string):
                    quote = False
                    retval = []
                    current = ""
                    for char in string:
                        if char == '"':
                            quote = not quote #ici cette ligne rend quote égal à son inverse
                            #si quote vaut vrai, not quote vaut faux
                            #sinon si quote vaut faux, not quote vaut vrai
                            #résultat : quote = True jusqu'à la prochaine occurence de '"' dans
                            #string
                        elif char == ',' and not quote:
                            #la c'est de la logique :
                            #vrai et vrai => vrai
                            #faux et vrai => faux
                            #vrai et faux => faux
                            #faux et faux => faux
                            #ici quote = False (ou est dans le ELIF, pas dans le IF)
                            #donc : not quote = True, a moins que l'on ai rencontrer un '"' !
                            #si tu veux capturer ce qui est entre '"' alors mets and quote
                            retval.append(current) #la pas de soucie
                            current = ""
                        else:
                            current += char
                    retval.append(current)
                    return retval
                


                Voila j’espère que ces petites explications te serons utiles.
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  31 octobre 2011 à 17:38:50

                  Dans ce cas précis, ça n'a sûrement pas d'importance, mais algorithmiquement parlant la fonction mysplit est plus optimisé que l'utilisation de la méthode split deux fois de suite (sans parler du slicing qui fait une copie de la liste à chaque fois).
                  • Partager sur Facebook
                  • Partager sur Twitter
                    2 novembre 2011 à 17:53:13

                    edit: bon, simplement pour dire que je comprends le principe du code, mais "and not quote" voudrait plutôt dire false, donc le elif devrait correspondre à quote == false pour ne pas couper le mot tant que quote n'est pas revenu à false dans le "if", mais c'était un peu flou pour moi, je pensais que "and not quote" voulait dire "l'inverse de quote" , alors que ça veut seulement dire "quote doit être à false".

                    bref, merci pour vos réponses ;)
                    • Partager sur Facebook
                    • Partager sur Twitter

                    question débutant : séparer une ligne

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown