Partage
  • Partager sur Facebook
  • Partager sur Twitter

Faire correspondre plusieurs lignes python

    18 mars 2022 à 17:07:58

    Bonjour je souhaite faire correspondre plusieurs lignes situé sur une colonne pour les mettre sur deux colonnes et les lignes qui correspondent pas seront supprimé tout cela en python et les lignes sont situé dans un fichier texte.

    Je débute en python pourriez vous me dire comment je dois procéder ?

    Voici le texte:

    0 EXT_FRAISE 

    3 EXT_BANANE

    8 EXT_NOIX-CAJOU 

    28 EXT_POMME-ROUGE

    109 EXT RIZ CUIT

    198 EXT_LIGHT&COCA 

    0 VIN

    1 FRAISE

    2 Banane

    5 NOIX_CAJOU

    14 POMME-ROUGE

    32 NOIX_DU_BRESIL

    54 RIZ CUIT

    98 LIGHT&COCA

    Voici le résultat voulu:

    0;EXT_FRAISE;1;FRAISE

    3;EXT_BANANE;2;Banane

    8;EXT_NOIX-CAJOU;5;NOIX_CAJOU

    28;EXT_POMME-ROUGE;14;POMME-ROUGE

    109;EXT RIZ CUIT;54;RIZ CUIT

    198;EXT_LIGHT&COCA;98;LIGHT&COCA

    Merci d'avance !

    • Partager sur Facebook
    • Partager sur Twitter
      18 mars 2022 à 17:38:00

      Le principe de base, c'est se demander comment moi, avec mes "doigts", je procéderai. Par exemple, ce qui vient "naturellement":

      1-ouvrir le fichier

      2-lire le fichier et récupérer les lignes dans une liste All

      3-on peut fermer le fichier

      4-Séparer ma liste selon que la ligne contient ou non la chaine "EXT_" (si la ligne contient "EXT_", je la mets dans une liste ListeExt, sinon je la mets dans une liste listeNormale)

      5-Je parcours ListeExt et je regarde si le mot qui suit EXT_ est présent dans la listeNormale; si oui, j'ajoute les éléments dans ListeFinale 

      6-j'écris ListeFinale dans mon fichier de sortie.

      Après, en regardant de plus près, je vois que les noms sont en majuscule ou pas (donc, je vais devoir mettre mes chaines en minuscule ou en majuscule pour pouvoir les comparer); que pour la noix de cajou, j'ai d'un côté NOIX-CAJOU et de l'autre NOIX_CAJOU, donc il va aussi falloir que je fasse quelque chose pour gérer ça.

      Enfin (ou plutôt ce que j'aurai dû/pu me demander en premier), c'est d'où sont issus ces informations ? Si ça vient d'une base de données, est-ce que je ne peux pas avoir directement le bon format de sortie avec une requête SQL (ou autre), et du coup, corriger dans cette base les points observés juste au dessus (minuscule/majuscule et le cas de NOIX_CAJOU/NOIX-CAJOU et autres si il y en a).

      • Partager sur Facebook
      • Partager sur Twitter
        19 mars 2022 à 9:35:42

        Tu peux uitilser un split(";")
        • Partager sur Facebook
        • Partager sur Twitter

        Linaki, l'excellence garantie !

        My website

          21 mars 2022 à 15:07:12

          ChrisFERREIRA2 a écrit:

          Bonjour je souhaite faire correspondre plusieurs lignes situé sur une colonne pour les mettre sur deux colonnes et les lignes qui correspondent pas seront supprimé tout cela en python et les lignes sont situé dans un fichier texte.

          Je débute en python pourriez vous me dire comment je dois procéder ?

          Voici le texte:

          0 EXT_FRAISE 

          3 EXT_BANANE

          8 EXT_NOIX-CAJOU 

          28 EXT_POMME-ROUGE

          109 EXT RIZ CUIT

          198 EXT_LIGHT&COCA 

          0 VIN

          1 FRAISE

          2 Banane

          5 NOIX_CAJOU

          14 POMME-ROUGE

          32 NOIX_DU_BRESIL

          54 RIZ CUIT

          98 LIGHT&COCA

          Voici le résultat voulu:

          0;EXT_FRAISE;1;FRAISE

          3;EXT_BANANE;2;Banane

          8;EXT_NOIX-CAJOU;5;NOIX_CAJOU

          28;EXT_POMME-ROUGE;14;POMME-ROUGE

          109;EXT RIZ CUIT;54;RIZ CUIT

          198;EXT_LIGHT&COCA;98;LIGHT&COCA

          Merci d'avance !


          Je regarde de mon côté

          -
          Edité par xavierduart 21 mars 2022 à 15:08:33

          • Partager sur Facebook
          • Partager sur Twitter
            21 mars 2022 à 15:09:50

            umfred a écrit:

            Le principe de base, c'est se demander comment moi, avec mes "doigts", je procéderai. Par exemple, ce qui vient "naturellement":

            1-ouvrir le fichier

            2-lire le fichier et récupérer les lignes dans une liste All

            3-on peut fermer le fichier

            4-Séparer ma liste selon que la ligne contient ou non la chaine "EXT_" (si la ligne contient "EXT_", je la mets dans une liste ListeExt, sinon je la mets dans une liste listeNormale)

            5-Je parcours ListeExt et je regarde si le mot qui suit EXT_ est présent dans la listeNormale; si oui, j'ajoute les éléments dans ListeFinale 

            6-j'écris ListeFinale dans mon fichier de sortie.

            Après, en regardant de plus près, je vois que les noms sont en majuscule ou pas (donc, je vais devoir mettre mes chaines en minuscule ou en majuscule pour pouvoir les comparer); que pour la noix de cajou, j'ai d'un côté NOIX-CAJOU et de l'autre NOIX_CAJOU, donc il va aussi falloir que je fasse quelque chose pour gérer ça.

            Enfin (ou plutôt ce que j'aurai dû/pu me demander en premier), c'est d'où sont issus ces informations ? Si ça vient d'une base de données, est-ce que je ne peux pas avoir directement le bon format de sortie avec une requête SQL (ou autre), et du coup, corriger dans cette base les points observés juste au dessus (minuscule/majuscule et le cas de NOIX_CAJOU/NOIX-CAJOU et autres si il y en a).


            Bonjour ce sont les étapes 4, 5 et 6 qui me pose problème je ne sais pas comment écrire cela en python ?

            Ces infos sont seulement issues d'un fichier texte pas de SQL ni de base de données.

            • Partager sur Facebook
            • Partager sur Twitter
              21 mars 2022 à 16:44:47

              Bonjour,

              exemple pour l'étape 4:

              ListeExt, listeNormale = [], []
              if('EXT' in ligne):
                  ListeExt.append(ligne)
              else:
                  listeNormale.append(ligne)

              ligne étant un élément de la liste à parcourir qui contient tout le fichier

              • Partager sur Facebook
              • Partager sur Twitter
                21 mars 2022 à 18:02:59

                pour le 5:

                ListeFinale=[]
                for i in range(len(ListeExt)):
                    texteATrouver=ListeExt[i].split('EXT_',maxsplit=1)[1].lower()
                    for texte in listeNormale:
                        if texteATrouver == texte.split(maxsplit=1)[1].lower():
                            ListeFinale.append(ListeExt[i])
                            break
                


                la ligne 3 sépare le texte '3 EXT_BANANE' en liste de 2 (maxsplit+1) éléments dont le séparateur est 'EXT_' ce qui donne ['3 ','BANANE'], donc on prend l'élément 1 de cette liste qui est 'BANANE' et le passe en minuscule

                la ligne 5 fait une opération de même style sur '2 Banane' (2 éléments avec séparateur un whitespace (pour faire simple on dira tout espace) ce qui donne ['2','Banane'] et on passe ce 'Banane' en minuscule pour pouvoir le comparer au 'banane' issu de la ligne 3

                le break permet de sortir de la boucle de la ligne 4 quand on a trouvé une correspondance.

                Ne pas oublie le cas NOIX_CAJOU/NOIX-CAJOU si ce n'est pas une erreur de copier/coller.

                • Partager sur Facebook
                • Partager sur Twitter
                  28 mars 2022 à 9:49:56

                  umfred a écrit:

                  pour le 5:

                  ListeFinale=[]
                  for i in range(len(ListeExt)):
                      texteATrouver=ListeExt[i].split('EXT_',maxsplit=1)[1].lower()
                      for texte in listeNormale:
                          if texteATrouver == texte.split(maxsplit=1)[1].lower():
                              ListeFinale.append(ListeExt[i])
                              break
                  


                  la ligne 3 sépare le texte '3 EXT_BANANE' en liste de 2 (maxsplit+1) éléments dont le séparateur est 'EXT_' ce qui donne ['3 ','BANANE'], donc on prend l'élément 1 de cette liste qui est 'BANANE' et le passe en minuscule

                  la ligne 5 fait une opération de même style sur '2 Banane' (2 éléments avec séparateur un whitespace (pour faire simple on dira tout espace) ce qui donne ['2','Banane'] et on passe ce 'Banane' en minuscule pour pouvoir le comparer au 'banane' issu de la ligne 3

                  le break permet de sortir de la boucle de la ligne 4 quand on a trouvé une correspondance.

                  Ne pas oublie le cas NOIX_CAJOU/NOIX-CAJOU si ce n'est pas une erreur de copier/coller.


                  Le cas  NOIX_CAJOU/NOIX-CAJOU n'est pas une erreur,l'étape 6  pour mettre ce qu'il y a dans le tableau finale et l'écrire dans le fichier j'écris cela comment en python ? J'ai essayé cela mais j'ai une erreur "    texteATrouver=ListeExt[i].split('EXT_',maxsplit=1)[1].lower()

                  IndexError: list index out of range

                  "

                  mon code:

                  with open("test.txt", "r") as f1:
                      ListeExt=f1.readlines()
                      listeNormale=f1.readlines()
                  ListeFinale=[]
                  for i in range(len(ListeExt)):
                      texteATrouver=ListeExt[i].split('EXT_',maxsplit=1)[1].lower()
                      for texte in listeNormale:
                          if texteATrouver == texte.split(maxsplit=1)[1].lower():
                              ListeFinale.append(ListeExt[i])
                              break    
                  with open('test.txt', 'w') as f2:
                      f2.writelines(ListeFinale)




                  -
                  Edité par XavierDuart2 28 mars 2022 à 10:05:24

                  • Partager sur Facebook
                  • Partager sur Twitter
                    28 mars 2022 à 10:42:04

                    je n'ai mis que l'étape 5 de ce que j'avais décrit, il faut passer par l'étape 4 avant, soit le code écrit par Phil_1857.
                    l'erreur vient du fait que tu traites toutes les chaines du fichier et tu cherches l'élément après la chaine "EXT_" et comme cette chaine n'est pas sur toutes les lignes, erreurs sur celles qui n'ont pas cette chaine.

                    Pour moi, le cas NOIX-CAJOU/NOIX_CAJOU est un problème de cohérence des données, après, on peut utiliser un replace lors de la comparaison

                    if texteATrouver.replace("-","_") == texte.split(maxsplit=1)[1].lower().replace("-","_")



                    • Partager sur Facebook
                    • Partager sur Twitter
                      28 mars 2022 à 12:33:05

                      umfred a écrit:

                      je n'ai mis que l'étape 5 de ce que j'avais décrit, il faut passer par l'étape 4 avant, soit le code écrit par Phil_1857.
                      l'erreur vient du fait que tu traites toutes les chaines du fichier et tu cherches l'élément après la chaine "EXT_" et comme cette chaine n'est pas sur toutes les lignes, erreurs sur celles qui n'ont pas cette chaine.

                      Pour moi, le cas NOIX-CAJOU/NOIX_CAJOU est un problème de cohérence des données, après, on peut utiliser un replace lors de la comparaison

                      if texteATrouver.replace("-","_") == texte.split(maxsplit=1)[1].lower().replace("-","_")



                      Je viens de modifier mon code en rajoutant l'étape 4, le souci alors il n'y a pas derreur mais le fichier il y a plus rien dedans

                      mon code

                      with open("test.txt", "r") as f1:
                              ligne=f1.readlines()
                      ListeExt, listeNormale = [], []
                      if('EXT' in ligne):
                          ListeExt.append(ligne)
                      else:
                          listeNormale.append(ligne)
                      
                      ListeFinale=[]
                      for i in range(len(ListeExt)):
                          texteATrouver=ListeExt[i].split('EXT_',maxsplit=1)[1].lower()
                          for texte in listeNormale:
                              if texteATrouver == texte.split(maxsplit=1)[1].lower():
                                  ListeFinale.append(ListeExt[i])
                                  break    
                      with open('test.txt', 'w') as f2:
                          f2.writelines(ListeFinale)



                      Et je ne veux pas remplacer les "-" et les "_" pour le cas Noix de cajou j'aimerai les laisser comme tel mais oui seulement les modifier lors de la comparaison

                      -
                      Edité par XavierDuart2 28 mars 2022 à 15:20:53

                      • Partager sur Facebook
                      • Partager sur Twitter
                        28 mars 2022 à 18:11:56

                        tu as mal ajouté le code de l'étape 4, Phil_1857 a bien précisé que ligne est un élément de la liste contenant les lignes des fichiers. Or dans ton code, ligne est la liste contenant les lignes ligne[0] est la 1ère ligne du fichier, ... Donc il faut parcourir cette liste et sur chacune des lignes faire le test.

                        Le replace que j'ai indiqué permet de tester les 2 lignes  avec le même symbole séparateur, sinon, les 2 valeurs seront différentes, au final, le texte ne sera pas remplacer.

                        Tu peux faire des essais dans l'interpréteur python pour voir ce que fait chaque étape.

                        • Partager sur Facebook
                        • Partager sur Twitter
                          29 mars 2022 à 8:47:15

                          umfred a écrit:

                          tu as mal ajouté le code de l'étape 4, Phil_1857 a bien précisé que ligne est un élément de la liste contenant les lignes des fichiers. Or dans ton code, ligne est la liste contenant les lignes ligne[0] est la 1ère ligne du fichier, ... Donc il faut parcourir cette liste et sur chacune des lignes faire le test.

                          Le replace que j'ai indiqué permet de tester les 2 lignes  avec le même symbole séparateur, sinon, les 2 valeurs seront différentes, au final, le texte ne sera pas remplacer.

                          Tu peux faire des essais dans l'interpréteur python pour voir ce que fait chaque étape.

                          Phil_1857 a écrit:

                          Bonjour,

                          exemple pour l'étape 4:

                          ListeExt, listeNormale = [], []
                          if('EXT' in ligne):
                              ListeExt.append(ligne)
                          else:
                              listeNormale.append(ligne)

                          ligne étant un élément de la liste à parcourir qui contient tout le fichier


                          Le Soucis c'est que quand j'exécute le code tel quel de l'étape 4 je ne rentre jamais dans le if mais seulement dans le else, donc quandje fait un print dans le if et le else j'ai seulement la liste des lignes sans les "Ext" et celle des "Ext" j'ai rien.

                          -
                          Edité par XavierDuart2 29 mars 2022 à 9:27:24

                          • Partager sur Facebook
                          • Partager sur Twitter
                            29 mars 2022 à 9:35:32

                            Bonjour,

                            C'est voulu le EXT devant tes produits ?

                            • Partager sur Facebook
                            • Partager sur Twitter

                            Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                            La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                              29 mars 2022 à 9:48:12

                              Je le répète, l'exemple fonctionne pour 1 (UNE) ligne et qu'il faut mettre ce code dans une BOUCLE qui PARCOURT les lignes du fichier.
                              Le code fait si ligne contient "EXT" il va dans la 1ère liste sinon dans la 2nde

                              • Partager sur Facebook
                              • Partager sur Twitter
                                29 mars 2022 à 10:11:55

                                En un seul parcourt et avec un dictionnaire comme cache/buffer.
                                with open('input.txt') as input_, open('output.txt', 'w') as output:
                                    cache = {}
                                    for line in input_:
                                        number, label = line.strip().split(maxsplit=1)
                                        key = "".join(c if c.isalnum() else '_' for c in label).upper()
                                        if key.startswith('EXT_'):
                                            cache[key[4:]] = f'{number};{label}'
                                        elif key in cache:
                                            output.write(cache.pop(key) + f';{number};{label}\n')

                                -
                                Edité par ЯК 29 mars 2022 à 12:13:23

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  29 mars 2022 à 11:03:58

                                  fred1599 a écrit:

                                  Bonjour,

                                  C'est voulu le EXT devant tes produits ?


                                  Oui c'est voulu fred

                                  umfred a écrit:

                                  Je le répète, l'exemple fonctionne pour 1 (UNE) ligne et qu'il faut mettre ce code dans une BOUCLE qui PARCOURT les lignes du fichier.
                                  Le code fait si ligne contient "EXT" il va dans la 1ère liste sinon dans la 2nde

                                  J'ai essayé avec une boucle , j'ai eu une erreur:

                                  texteATrouver=ListeExt[i].split('EXT_',maxsplit=1)[1].lower()

                                  IndexError: list index out of range

                                  j'ai donc modifier le "=" en "<" apres le "texteATrouver" puis jai une autre erreur comme quoi "texteATrouver" c'est pas déclarer

                                  l'erreur  :   

                                  texteATrouver<ListeExt[i].split('EXT_',maxsplit=1)[1].lower()

                                  NameError: name 'texteATrouver' is not defined

                                  Le code:

                                  with open("test.txt", "r") as f1:  
                                      listes = f1.readlines()      
                                      ListeExt, listeNormale = [], []
                                  for liste in listes:
                                      if('EXT' in liste):
                                          ListeExt.append(liste)
                                          #print(liste)
                                      else:
                                          listeNormale.append(liste)
                                          #print(liste)
                                  #print(liste)        
                                  ListeFinale=[]
                                  for i in range(len(ListeExt)):
                                     texteATrouver<ListeExt[i].split('EXT_',maxsplit=1)[1].lower()
                                     for texte in listeNormale:
                                         if texteATrouver == texte.split(maxsplit=1)[1].lower():
                                             ListeFinale.append(ListeExt[i])
                                             break  
                                  print(ListeFinale)






                                  ЯК a écrit:

                                  En un seul parcourt et avec un dictionnaire comme cache/buffer.

                                  with open('input.txt') as input_, open('output.txt', 'w') as output:
                                      cache = {}
                                      for line in input_:
                                          number, label = line.strip().split(maxsplit=1)
                                          key = "".join(c if c.isalnum() else '_' for c in label).upper()
                                          if key.startswith('EXT_'):
                                              cache[key[4:]] = f'{number};{label}'
                                          else:
                                              output.write(cache.pop(key) + f';{number};{label}\n')

                                  -
                                  Edité par ЯК il y a 33 minutes


                                  J'ai essayé ton code il me met un key error avec une ligne qui a pas EXT



                                  -
                                  Edité par XavierDuart2 29 mars 2022 à 12:31:14

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    29 mars 2022 à 12:17:10

                                    Il faut adapter la ligne 8, j'ai édité mon message en conséquence. Et s'il y a des lignes vides dans le fichier, il faudra aussi ajouter une condition au bon endroit..

                                    -
                                    Edité par ЯК 29 mars 2022 à 12:18:05

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      29 mars 2022 à 12:43:35

                                      ЯК a écrit:

                                      Il faut adapter la ligne 8, j'ai édité mon message en conséquence. Et s'il y a des lignes vides dans le fichier, il faudra aussi ajouter une condition au bon endroit..

                                      -
                                      Edité par ЯК il y a 12 minutes


                                      Normalement j'ai pas de ligne vide je les supprimer dans un autre prog au préalable effectivement avec le elif c'est mieux merci !
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        29 mars 2022 à 13:24:29

                                        pourquoi le = s'est transformé en < en ligne 14 (la ligne où se produit l'erreur) ? la ligne 14 sert à initialiser la variable, donc ta nouvelle erreur est normale.

                                        le index error voudrait dire qu'il n'y a pas de valeur dans ListeExt .. tu as réécrit et enregistré le fichier test.txt suite à l'essai précédent qui l'avait vidé ?

                                        retire aussi le _ après EXT sur cette ligne 14, je viens de voir qu'on a "EXT RIZ CUIT" sans le underscore (_) ..... (il va causer un autre ennui, c'est que la chaine va commencer par un espace et non pas par un _ , donc pour la comparasion, encore un cas particulier ........... )

                                        -
                                        Edité par umfred 29 mars 2022 à 13:26:24

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          29 mars 2022 à 13:57:40

                                          Si tu veux un exemple propre, alors il faut que tes données soient très précises et proprement annoncées,

                                          Si je vois 

                                          8 EXT_NOIX-CAJOU
                                          
                                          et 
                                          
                                          5 NOIX_CAJOU

                                          ça pose un problème de format et donc difficile d'avoir une logique. Si il est écrit réellement de cette manière, faut monter à la génération du fichier et demander à ce que le format soit cohérent.

                                          Avec ce fichier,

                                          0 EXT_FRAISE
                                          3 EXT_BANANE
                                          8 EXT_NOIX-CAJOU
                                          28 EXT_POMME-ROUGE
                                          109 EXT_RIZ_CUIT
                                          198 EXT_LIGHT&COCA
                                          1 FRAISE
                                          2 Banane
                                          5 NOIX-CAJOU
                                          14 POMME-ROUGE
                                          32 NOIX_DU_BRESIL
                                          54 RIZ_CUIT
                                          98 LIGHT&COCA

                                          je reçois ce résultat

                                          0;EXT_FRAISE;1;FRAISE
                                          3;EXT_BANANE;2;Banane
                                          8;EXT_NOIX-CAJOU;5;NOIX-CAJOU
                                          28;EXT_POMME-ROUGE;14;POMME-ROUGE
                                          109;EXT_RIZ_CUIT;54;RIZ_CUIT
                                          198;EXT_LIGHT&COCA;98;LIGHT&COCA
                                          32 NOIX_DU_BRESIL

                                          avec ce code,

                                          from typing import Optional
                                          
                                          def set_line(number_of_line: int, lines: list[Optional[str]], products: list[str]) -> None:
                                              line = lines[number_of_line]
                                              if line:
                                                  _, product = line.split(maxsplit=1)
                                                  product = product.upper()
                                                  try:
                                                      index_of_product = products.index("EXT_" + product)
                                                      line_product = lines[index_of_product]
                                                      if line_product is not None:
                                                          lines[index_of_product] = ';'.join(
                                                              line_product.split()
                                                              ) + ';' + ';'.join(line.split())
                                                          lines[number_of_line] = None
                                                  except ValueError:
                                                      products.append(product)
                                          
                                          prods: list[str] = []
                                          my_lines: list[Optional[str]] = []
                                          with open("test.csv", "r", encoding="utf8") as f:
                                              my_lines = [line.strip() for line in f.readlines()]
                                              for ind, _ in enumerate(my_lines):
                                                  set_line(ind, my_lines, prods)
                                          
                                          
                                          for row in my_lines:
                                              if row is not None:
                                                  print(row)

                                          Je pense que ça ne fonctionnera que si tes EXT se trouvent avant tes produits sans EXT.


                                          • Partager sur Facebook
                                          • Partager sur Twitter

                                          Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                                          La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                                            29 mars 2022 à 14:34:49

                                            umfred a écrit:

                                            pourquoi le = s'est transformé en < en ligne 14 (la ligne où se produit l'erreur) ? la ligne 14 sert à initialiser la variable, donc ta nouvelle erreur est normale.

                                            le index error voudrait dire qu'il n'y a pas de valeur dans ListeExt .. tu as réécrit et enregistré le fichier test.txt suite à l'essai précédent qui l'avait vidé ?

                                            retire aussi le _ après EXT sur cette ligne 14, je viens de voir qu'on a "EXT RIZ CUIT" sans le underscore (_) ..... (il va causer un autre ennui, c'est que la chaine va commencer par un espace et non pas par un _ , donc pour la comparasion, encore un cas particulier ........... )

                                            -
                                            Edité par umfred il y a environ 1 heure


                                            Parce que avec le "=" j'avais encore l'erreur du index out of range que je n'ai toujours pas réussi a réglé, oui je l'ai réécris et enregistré après. J'ai aussi retiré le underscore.

                                            fred1599 a écrit:

                                            Si tu veux un exemple propre, alors il faut que tes données soient très précises et proprement annoncées,

                                            Si je vois 

                                            8 EXT_NOIX-CAJOU
                                            
                                            et 
                                            
                                            5 NOIX_CAJOU

                                            ça pose un problème de format et donc difficile d'avoir une logique. Si il est écrit réellement de cette manière, faut monter à la génération du fichier et demander à ce que le format soit cohérent.

                                            Avec ce fichier,

                                            0 EXT_FRAISE
                                            3 EXT_BANANE
                                            8 EXT_NOIX-CAJOU
                                            28 EXT_POMME-ROUGE
                                            109 EXT_RIZ_CUIT
                                            198 EXT_LIGHT&COCA
                                            1 FRAISE
                                            2 Banane
                                            5 NOIX-CAJOU
                                            14 POMME-ROUGE
                                            32 NOIX_DU_BRESIL
                                            54 RIZ_CUIT
                                            98 LIGHT&COCA

                                            je reçois ce résultat

                                            0;EXT_FRAISE;1;FRAISE
                                            3;EXT_BANANE;2;Banane
                                            8;EXT_NOIX-CAJOU;5;NOIX-CAJOU
                                            28;EXT_POMME-ROUGE;14;POMME-ROUGE
                                            109;EXT_RIZ_CUIT;54;RIZ_CUIT
                                            198;EXT_LIGHT&COCA;98;LIGHT&COCA
                                            32 NOIX_DU_BRESIL

                                            avec ce code,

                                            from typing import Optional
                                            
                                            def set_line(number_of_line: int, lines: list[Optional[str]], products: list[str]) -> None:
                                                line = lines[number_of_line]
                                                if line:
                                                    _, product = line.split(maxsplit=1)
                                                    product = product.upper()
                                                    try:
                                                        index_of_product = products.index("EXT_" + product)
                                                        line_product = lines[index_of_product]
                                                        if line_product is not None:
                                                            lines[index_of_product] = ';'.join(
                                                                line_product.split()
                                                                ) + ';' + ';'.join(line.split())
                                                            lines[number_of_line] = None
                                                    except ValueError:
                                                        products.append(product)
                                            
                                            prods: list[str] = []
                                            my_lines: list[Optional[str]] = []
                                            with open("test.csv", "r", encoding="utf8") as f:
                                                my_lines = [line.strip() for line in f.readlines()]
                                                for ind, _ in enumerate(my_lines):
                                                    set_line(ind, my_lines, prods)
                                            
                                            
                                            for row in my_lines:
                                                if row is not None:
                                                    print(row)

                                            Je pense que ça ne fonctionnera que si tes EXT se trouvent avant tes produits sans EXT.


                                            Mon fichier est en texte et non en csv, j'ai essayé ton code j'ai cela comme erreur:

                                                def set_line(number_of_line: int, lines: list[Optional[str]], products: list[str]) -> None:

                                            TypeError: 'type' object is not subscriptable

                                            -
                                            Edité par XavierDuart2 29 mars 2022 à 14:44:47

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              29 mars 2022 à 14:45:01

                                              Tu n'as pas copié le traceback complet, je n'ai pas le numéro de ligne...

                                              Mais je crains que tu dois avoir des problèmes de formatage dans ton fichier, essaye voir avec le mien.

                                              • Partager sur Facebook
                                              • Partager sur Twitter

                                              Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                                              La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                                                29 mars 2022 à 14:52:01

                                                fred1599 a écrit:

                                                Tu n'as pas copié le traceback complet, je n'ai pas le numéro de ligne...

                                                Mais je crains que tu dois avoir des problèmes de formatage dans ton fichier, essaye voir avec le mien.


                                                C'est la ligne 3.

                                                -
                                                Edité par XavierDuart2 29 mars 2022 à 14:54:52

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  29 mars 2022 à 14:59:18

                                                  À quoi ressemble ton fichier de tests ?
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter

                                                  Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                                                  La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                                                    29 mars 2022 à 15:01:10

                                                    fred1599 a écrit:

                                                    À quoi ressemble ton fichier de tests ?


                                                    Il ressemble exactement au tiens mais en .txt de mon coté, le tiens c'est du csv ?

                                                    ЯК a écrit:

                                                    Il faut adapter la ligne 8, j'ai édité mon message en conséquence. Et s'il y a des lignes vides dans le fichier, il faudra aussi ajouter une condition au bon endroit..

                                                    -
                                                    Edité par ЯК il y a environ 1 heure

                                                    Je viens de remarquer dans ton code tu ouvre le 1er fichier pour ensuite écrire dans 2eme fichier, c'est possible de ouvrir le 1er fichier et de réecrire dans le même fichier ?

                                                    Car j'ai remplacer le test2.txt par le test.txt donc le 1er fichier, mais quand je l'ouvre après avoir exécuté le programme j'ai plus rien dans ce fichier.

                                                    le code:

                                                    with open('test.txt') as input_, open('test.txt', 'w') as output:
                                                        cache = {}
                                                        for line in input_:
                                                            number, label = line.strip().split(maxsplit=1)
                                                            key = "".join(c if c.isalnum() else '_' for c in label).upper()
                                                            if key.startswith('EXT_'):
                                                                cache[key[4:]] = f'{number};{label}'
                                                            elif key in cache:
                                                                output.write(cache.pop(key) + f';{number};{label}\n')





                                                    -
                                                    Edité par XavierDuart2 29 mars 2022 à 15:12:13

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      29 mars 2022 à 15:25:45

                                                      Je remets le contenu de mon fichier, peut-être une erreur de copier coller

                                                      0 EXT_FRAISE 
                                                      3 EXT_BANANE
                                                      8 EXT_NOIX-CAJOU 
                                                      28 EXT_POMME-ROUGE
                                                      109 EXT_RIZ_CUIT
                                                      198 EXT_LIGHT&COCA 
                                                      1 FRAISE
                                                      2 Banane
                                                      5 NOIX-CAJOU
                                                      14 POMME-ROUGE
                                                      32 NOIX_DU_BRESIL
                                                      54 RIZ_CUIT
                                                      98 LIGHT&COCA

                                                      chez moi je ne réussi pas à reproduire ton erreur, j'ai bien ce résultat

                                                      0;EXT_FRAISE;1;FRAISE
                                                      3;EXT_BANANE;2;Banane
                                                      8;EXT_NOIX-CAJOU;5;NOIX-CAJOU
                                                      28;EXT_POMME-ROUGE;14;POMME-ROUGE
                                                      109;EXT_RIZ_CUIT;54;RIZ_CUIT
                                                      198;EXT_LIGHT&COCA;98;LIGHT&COCA
                                                      32 NOIX_DU_BRESIL




                                                      • Partager sur Facebook
                                                      • Partager sur Twitter

                                                      Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                                                      La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                                                        29 mars 2022 à 15:36:14

                                                        fred1599 a écrit:

                                                        Je remets le contenu de mon fichier, peut-être une erreur de copier coller

                                                        0 EXT_FRAISE 
                                                        3 EXT_BANANE
                                                        8 EXT_NOIX-CAJOU 
                                                        28 EXT_POMME-ROUGE
                                                        109 EXT_RIZ_CUIT
                                                        198 EXT_LIGHT&COCA 
                                                        1 FRAISE
                                                        2 Banane
                                                        5 NOIX-CAJOU
                                                        14 POMME-ROUGE
                                                        32 NOIX_DU_BRESIL
                                                        54 RIZ_CUIT
                                                        98 LIGHT&COCA

                                                        chez moi je ne réussi pas à reproduire ton erreur, j'ai bien ce résultat

                                                        0;EXT_FRAISE;1;FRAISE
                                                        3;EXT_BANANE;2;Banane
                                                        8;EXT_NOIX-CAJOU;5;NOIX-CAJOU
                                                        28;EXT_POMME-ROUGE;14;POMME-ROUGE
                                                        109;EXT_RIZ_CUIT;54;RIZ_CUIT
                                                        198;EXT_LIGHT&COCA;98;LIGHT&COCA
                                                        32 NOIX_DU_BRESIL



                                                        Mais c'est un fichier CSV ou texte que tu as a la base ? Parce que je vois lorsque tu écris le fichier tu l'écris en CSV

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          29 mars 2022 à 15:45:32

                                                          ça change rien, un fichier csv est un fichier texte
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter

                                                          Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                                                          La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                                                            29 mars 2022 à 15:53:31

                                                            fred1599 a écrit:

                                                            ça change rien, un fichier csv est un fichier texte


                                                            C'est pas exactement pareil je crois lorsqu'on fais du python

                                                            -
                                                            Edité par XavierDuart2 29 mars 2022 à 15:53:43

                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              29 mars 2022 à 15:56:32

                                                              ChrisFERREIRA2 a écrit:

                                                              fred1599 a écrit:

                                                              ça change rien, un fichier csv est un fichier texte


                                                              C'est pas exactement pareil je crois lorsqu'on fais du python

                                                              Si !

                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                                                              La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                                                              Faire correspondre plusieurs lignes python

                                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                              • Editeur
                                                              • Markdown