Vous êtes ici : Accueil / Forums & ML / Forums Python / Forum général Python / comparaison 2 chaines boucle for

comparaison 2 chaines boucle for

Remonter à Forum général Python
  • comparaison 2 chaines boucle for

    Envoyé par laurentE le 20 Février 2009 à 16:40
    Je souhaite comparer 2 chaînes de caractères ( fichier txt ) et traiter un fichier en sortie, avec condition de traitement si une partie de la des 2 chaînes sont identiques ( gestion de stock)

    Exemple résumé succinctement :
    Fichier 1 ( paul 10 qté)
    Fichier 2 ( ref 10 qte )
    Fichiersortie = open(‘sortie.txt’,’w’)


    For i in fichier1.plit():

    For j in fichier2.slpit():
    If fichier2[1:2] == fichier1[1:2]
    Fichiersortie.write()


    Je ne sais pas comment imbriquer ces conditions, ou mettre le readline pour lire les fichiers ligne par ligne et de plus je pense faire des calcul sur la quantité , avez-vous une idée ou une solution plus simple que ce schéma

    D’avance merci
    • Re: comparaison 2 chaines boucle for

      Envoyé par laurentE le 24 Mars 2009 à 13:45
      En m’inspirant de ce script je dois l’adapter aussi un besoin différent :
      1 dans mes commandes c’est une référence équivalente qui est traitée par conséquent mon stock comporte une ref père et fils + qtés ; ce qui me bloque c’est que je ne peux utiliser un dictionnaire dans ce cas là (limité à ma connaissance à la clé et valeur),
      2 la commande peut être répartie sur plusieurs ref liées (expl. cde de 20 : 10 ref1,10ref1 etc...)
      j’ai essayé avec une liste[] la boucle fonctionne mais je ne sais pas au fur et à mesure de la boucle mettre à jour les variables stock et commande, avez-vous une idée à ce sujet ?
      Cdt
      Laurent
      Données en entrée
      stock.txt
      ::::::::::::::
      ref qté refpère
      ref10 50 equiref10
      ref11 20 equiref11
      ref12 3,7 equiref12
      ::::::::::::::
      commandes.txt
      ::::::::::::::
      paul equiref10 10
      paul equiref10 23
      pierre equiref10 2
      jacques equiref10 1,2
      sinsemillia equiref10 9 5
    • Re: comparaison 2 chaines boucle for

      Envoyé par glickind le 20 Février 2009 à 17:31
      désolé mais je crains que tu ne sois pas assez précis pour qu'on puisse t'aider.
      peux-tu donner un exemple avec plusieurs lignes dans les fichiers 1, 2 et de sortie en respectant scrupuleusement le format de ces fichiers ?

      ca serait bien s'il y avait un identifiant pour chaque produit (comme un code barre)
      car si Paul a pris 10 dans le fichier 1, et que j'ai 10 pommes et 10 poires dans le fichier 2,
      comment je sais s'il a pris des pommes ou des poires ?

      Autre cas: il y a 10 pommes en stock, Paul en a pris 6, doit-on mettre qu'il en reste 4 en stock dans le fichier de sortie ?
      • Re: comparaison 2 chaines boucle for

        Envoyé par laurentE le 20 Février 2009 à 19:50
        Désolé effectivement ma demande n'est pas assez présice, merci beaucoup de ta réponse,

        voici les explications que j'espère soient complémentaires:

        Le fichier 1 correspond à la demande : fichier à plat format txt avec séparateur espace : (clientPaul demande la reférence 10 avec sa quantité).

        Voici un exemple avec plusieurs lignes du fichier txt brut:

        fichier1
        paul ref10 10
        paul ref11 3
        pierre ref10 2 ect..

        fichier2
        ref10 50
        ref11 20 etc..

        fichiersortie

        paul ref10 10
        paul ref11 3
        Pierre ref10 2

        Ligne 2 au stock disponible : ref, quantité en stock)

        Fichier1 = (ref10 qté)
        Fichier2 ( ref10 qte )
        Fichiersortie = open(‘sortie.txt’,’w’)


        For i in fichier1.plit():

        For j in fichier2.slpit():
        If fichier2[1:2] == fichier1[1:2]
        si dispo
        Mise a jour fichier2(stock)
        Fichiersortie.write()
    • Re: comparaison 2 chaines boucle for

      Envoyé par glickind le 21 Février 2009 à 04:00
      dis-moi si j'ai bien compris
      1. ton fichier 1 est ta commande, ton fichier 2 est ton stock
      2. ton fichier sortie est exactement le même que le fichier 1 (c'est quoi l'intérêt ?)
      3. tu veux mettre à jour ton fichier 2 de stock en déduisant les quantités commandées

      4. que fais-tu si le stock est insuffisant ?
      • Re: comparaison 2 chaines boucle for

        Envoyé par laurentE le 22 Février 2009 à 10:55
        Dans l'absolu c'est ça, évidement il faudra rajouter les conditions nécessaires ( stock >=0 , demande >0 etc) , mais ce qui me pose problème pour débuter c'est de parcourir les 2 fichiers ( stock et commande) en détachant sur chaque ligne les champs.
        En effet j'ai fait qq essais, même avec la commande split() le seul résultat que j'obtiens c'est une lecture des caractères 1 par 1 de chaque lignes, ce qui ne permet aucun traitement de comparaison.
        Merci encore.
    • Re: comparaison 2 chaines boucle for

      Envoyé par glickind le 24 Février 2009 à 11:16
      ::::::::::::::
      stock.txt
      ::::::::::::::
      ref10 50
      ref11 20
      ref12 3,7

      ::::::::::::::
      commandes.txt
      ::::::::::::::
      paul ref10 10
      paul ref11 23
      pierre ref10 2
      jacques ref12 1,2
      sinsemillia ref9 5


      #!/usr/bin/python

      # necessaire en Python 2.5, inutile en Python 2.6
      from __future__ import with_statement


      def nombre(chaine):
      """convertit une chaine en nombre"""
      chaine = chaine.replace(',','.')
      if '.' in chaine:
      return float(chaine)
      else:
      return int(chaine)

      sep = ' ' # un espace sera utilise comme separateur
      stock = {}
      with open("stock.txt") as fStock:
      for ligne in fStock:
      (reference,quantite) = ligne.split()
      stock[ reference] = nombre(quantite)

      with open("commandes.txt") as fCommandes:
      with open("suivi.txt",'w') as fSuivi:
      for ligne in fCommandes:
      (client, reference, sQuantite) = ligne.split()
      if reference not in stock:
      fSuivi.write(sep.join([ client, reference, sQuantite,'Pb Reference inconnue\n']))
      else:
      nQuantite = nombre(sQuantite)
      nouvelleQuantite = stock[ reference]-nQuantite
      if nouvelleQuantite >= 0:
      stock[ reference]=nouvelleQuantite
      fSuivi.write(sep.join([ client, reference, sQuantite,'OK\n']))
      else:
      fSuivi.write(sep.join([ client, reference, sQuantite,'Pb Stock insuffisant:',str(stock[ reference]),'\n']))

      with open("stock.txt",'w') as fNouveauStock:
      for reference,nQuantite in stock.iteritems():
      fNouveauStock.write(sep.join([ reference, str(nQuantite),'\n']))


      On obtient un fichier stock.txt mis à jour et un fichier suivi.txt :

      ::::::::::::::
      stock.txt
      ::::::::::::::
      ref11 20
      ref10 38
      ref12 2.5

      ::::::::::::::
      suivi.txt
      ::::::::::::::
      paul ref10 10 OK
      paul ref11 23 Pb Stock insuffisant: 20
      pierre ref10 2 OK
      jacques ref12 1,2 OK
      sinsemillia ref9 5 Pb Reference inconnue
    • Re: comparaison 2 chaines boucle for

      Envoyé par laurentE le 26 Février 2009 à 20:21
      Un grand merci remarquable, j'ai du lire et relire le code plusieurs des fois, je suis admiratif.... c'est exactement ce que je cherchais,
      J'ai dû du passer à la version 2.5 ( la joie de la compilation sur unix). Je ne connaissais pas la commande with_statement, bien pratique pour l'ouverture/fermeture de fichier mais dans l'ensemble ces commandes me sont familières, malgré mes croquis sur une feuille de papier j'ai du mal à définir les grandes lignes d'un programme et arriver au résultat escompté y a t-il une méthode de travail ou est-ce par la pratique et l'usage que l'on acquiers ces réflexes , cette logique ?
      Encore un grand merci de votre aide.
      Laurent
Rendu par Ploneboard