IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Générer une chaine de caractères avec 2 dictionnaires sous-jacents [Python 3.X]


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    curieux
    Inscrit en
    Mars 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : curieux

    Informations forums :
    Inscription : Mars 2016
    Messages : 13
    Par défaut Générer une chaine de caractères avec 2 dictionnaires sous-jacents
    Bonsoir,

    pour une interface comptable, je souhaite générer une chaîne de caractères en pointant sur 2 dictionnaires. Le premier retourne le libellé de l'opération à l'aide d'une abréviation contenue dans la ligne SQL, puis compléter cette chaine avec le destinataire ou l'expéditeur du mouvement financier.
    Les tests se font ligne par ligne retournée par la requête SQL. Avec le code ci-dessous, je n'ai pas le résultat escompté et je sèche depuis pas mal de temps.

    Merci à vous.

    Le moteur de base de données utilisé est SqlLite
    Le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Condition = "WHERE Interface='F' AND Code_societe=" + Societe
    sql1 = 'SELECT Date_ecriture,Libel,Montant  FROM Extrait ' + Condition #récupere les écritures non traitées de l'extrait
    curs1.execute(sql1)
    base_recup = curs1.fetchall()
    for row in base_recup:
        Montant=row[2].replace(".","").replace(",","")
        Date_saisie=row[0][0:2]+row[0][3:5]+row[0][8:10] # formatage de la date JJMMAA
        for k, value in Libel.items(): # Libel contient le code opération
            if row[1].find(k):
                for j,valeur in Libel_interface.items(): # Libel_interface contient le destinataire ou l'expéditeur
                    if row[1].find(j):
                        Libel_ecriture=value+'  '+j

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Déjà les codes se mettent entre balises [code]...[/code] (voir les règles, qui ne sont pas là pour faire chier les intervenants mais permettre de poster des codes lisibles ; parce que si tu as regardé ton post après l'avoir écrit, tu comprendras j'espère le souci qu'on peut avoir à vouloir le lire).

    Sinon malheureusement je ne comprends rien à tes explications. Que veut dire par exemple "en pointant sur 2 dictionnaires" ? Ou bien "le premier retourne" (un dictionnaire ne retourne rien, il contient des choses). Et ce d'autant plus qu'un dictionnaire c'est un container qui peut contenir plusieurs infos, exemple d={1 : "toto", 2 : "titi"}. Donc typiquement ici tu veux quoi? toto ou titi ??? Et comment "pointer sur d" ?????

    En tout cas, générer une chaine c'est pas compliqué ; ça se fait simplement via le "+" => s="xxx" + "yyy". Et si l'élément à intégrer n'est pas lui-même une chaine, on peut le transformer via str() => s=str(1) + str(2) + str(3). Ou alors passer par le formatage des choses => s="%d%d%d" % (1, 2, 3) ou s="{}{}{}".format(1, 2, 3). Ne reste qu'à récupérer proprement les éléments à intégrer dans la chaine.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    bonjour

    si j'ai compris ton code (illisible)

    tu fais une requete sql puis tu fais une recherche sur un champ dans une liste python ...

    1) Pas logique de ne pas avoir 2 tables " Libels" et "interfaces" !!!!! donc ton problème 2 ne devrait pas exister

    2) donc ta recherche est assez incompréhensible
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for k, value in Libel.items(): # Libel contient le code opération
        if row[1].find(k):
            for j,valeur in Libel_interface.items(): # Libel_interface contient le destinataire ou l'expéditeur
                if row[1].find(j):
                    Libel_ecriture=value+' '+j
    Donc tu peux séparer sql et "ta sous-requete python" dans un petit programme indépendant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Libel = {"PAYE": "augmentation", }
    Libel_interface = {"augmentation": "pour moi !", }
    # oui c'est faut tes 2 dico, mais pas compris ta logique de recherche pour en déduire des données
    row = "PAYE"
    for k, value in Libel.items(): # Libel contient le code opération
        if row.find(k):
            for j,valeur in Libel_interface.items(): # Libel_interface contient le destinataire ou l'expéditeur
                if row.find(j):
                    Libel_ecriture=value+' '+j
    print(Libel_ecriture)
    tes 2 boucles sur libel et libel_interface me paraissent "un peu" exessives surtout si c'est pour ensuite faire un find() - tu ne peux pas faire directement un get() ?

    puis compléter cette chaine avec le destinataire ou l'expéditeur du mouvement financier.
    Comme dit en 1) je trouve plus que bizarre que tu n'ai pas le destinatire dans ta base de donnée ... donc tu as sans doute plus un problème sql que python : faire une jointure entre 3 tables

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 738
    Par défaut
    Salut,

    Avec Sqlite, on peut faire une condition sur plusieurs valeurs "SELECT...WHERE Libel in (...)".
    On peut stocker des nombres (flottants) pour ne pas avoir à remplacer ',' par '.' lorsqu'on a écrit çà comme une chaîne de caractères.
    On peut aussi stocker des datetime via un adaptateur.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre averti
    Homme Profil pro
    curieux
    Inscrit en
    Mars 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : curieux

    Informations forums :
    Inscription : Mars 2016
    Messages : 13
    Par défaut Générer une chaine de caractères avec 2 dictionnaires
    Bonjour,

    pour info, je sais ce qu'est un dictionnaire. Il s'agit de retourner par rapport à une chaine qui contient le code de l'opération bancaire IDD , ainsi que le nom du destinataire du prelévement (code opération IDD), un libellé pour l'interface comptable;
    Voici l'exemple du libellé contenu dans le fichier source : "CEP TRESO SANTE PREV . IDD COR REF 8421295CXUPIQSDT 301"
    et le résultat escompté "PRLVT TRESO SANTE".
    J'ai préalablement stocké dans des tables de SqlLite : une correspondance entre les codes opération source('IDD') et le codes cibles ('VIRT'), puis une table pour la correspondance entre le code tiers, ici 'TRESO SANTE' et le code tiers comptable.

    L'objet du code est de :
    - générer le libellé pour l'interface 'PRVLT TRESO SANTE'
    - générer le code comptable du tiers, par exemple ici '43750100'.

    C'est pour cela que je fais appel à 2 dictionnaires:
    - un avec comme clé le code de l'opération de la source et pour valeur le code pour l'interface,
    - l'autre avec comme clé le tiers et pour valeur le code comptable du tiers.

    Pour chaque ligne du résultat de la requête sql, je teste l'existence, dans le libellé source du code opération pour stocker le code correspondant et l'existence du libellé du tiers.

    En ce qui concerne la remarque sur la condition dans la requête sql, je n'ai pas trouvé, malgré la lecture de plusieurs documents concernant sqlite, la possibilité de tester si le code opération est contenu dans le libellé. L'opérateur IN n'est valable qu'avec une liste de valeurs.

  6. #6
    Membre averti
    Homme Profil pro
    curieux
    Inscrit en
    Mars 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : curieux

    Informations forums :
    Inscription : Mars 2016
    Messages : 13
    Par défaut Générer une chaîne de caractères avec 2 dictionnaires
    Rebonjour,

    je viens de résoudre le problème avec 2 jointures sur les tables contenant l'extrait et les 2 tables de correspondances avec la fonction 'instr()' dans la condition de filtrage WHERE.

    merci pour vos commentaires.

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 738
    Par défaut
    Citation Envoyé par yves1107 Voir le message
    Voici l'exemple du libellé contenu dans le fichier source : "CEP TRESO SANTE PREV . IDD COR REF 8421295CXUPIQSDT 301"
    et le résultat escompté "PRLVT TRESO SANTE".
    Peut être que vous tirerez profit du LIKE de SQLite?

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment concaténer une chaine de caractères avec un espace ?
    Par blanchonvincent dans le forum MATLAB
    Réponses: 6
    Dernier message: 07/04/2007, 21h53
  2. [RegEx] Prélever une chaine de caractères avec contraintes
    Par Voodu dans le forum Langage
    Réponses: 5
    Dernier message: 17/03/2007, 23h36
  3. Dégradé sur une chaine de caractères avec 3 a 4 couleurs
    Par avogadro dans le forum Composants VCL
    Réponses: 6
    Dernier message: 31/03/2006, 13h21
  4. Lecture d'une chaine de caractère avec fgets
    Par mayoouketchup dans le forum Langage
    Réponses: 9
    Dernier message: 22/12/2005, 16h17
  5. Réponses: 2
    Dernier message: 06/12/2002, 07h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo