Comparer deux fichiers CSV avec Python

Résolu

Bonjour,

Je cherche à comparer 2 fichiers CSV pour en ressortir les similitude dans un autre fichiers mais pour le moment le programme me ressort les infos des 2 fichiers. 

Voici le programme :

import csv

with open('Recherche.csv', 'r',encoding='utf-8') as t1, open('TravailSFE.csv', 'r',encoding='utf-8') as t2:
    fileone = t1.readlines()
    filetwo = t2.readlines()

with open('update.csv', 'w',encoding='utf-8') as outFile:
    for line in filetwo:
        if line in fileone:
            outFile.write(lines)

Pour vous expliquer le fichier Recherche contient en 1ère colonne les adresses d'entreprise et la deuxième colonne les siren des entreprises. 

Et le fichier travail contient juste les adresses et j'aimerais donc que le fichier update me ressorte les adresses qui sont similaires pour en sortir les sirens ( je ne sais pas si c'est très clair ;) ) 

Si vous pouvez m'aidez je vous en remercierais. 
Windows / Chrome 128.0.0.0

13 réponses

Résumé de la discussion

On cherche à comparer deux CSV pour produire un fichier de sortie contenant les adresses communes et les SIREN correspondants, afin de faciliter le recensement des correspondances. Les solutions proposées recommandent d'utiliser le module csv et de construire un dictionnaire à partir du premier fichier pour stocker les adresses et les SIREN, puis de vérifier les adresses du second fichier. Pour éviter les erreurs de comparaison, plusieurs répondants préconisent de normaliser les adresses (minuscule, suppression des accents et espaces) et de gérer des séparateurs variés comme le point-virgule. Si le résultat reste vide, il faut aussi vérifier les en-têtes, les lignes mal formatées et les éventuelles différences de casse ou de caractères spéciaux pour comprendre où le processus échoue.

Bobot (l’IA à votre service)
  1. Bonjour,

    Si j'ai bien compris ce que vous voulez faire. Vous avez deux fichiers CSV : l'un contient les adresses d'entreprises avec leurs SIREN, et l'autre contient uniquement les adresses. Vous souhaitez créer un fichier de sortie avec les adresses communes et les SIREN correspondants.

    Si c'est bien cela, vous devez déjà vérifier si les fichiers CSV sont correctement formatés et que les adresses dans les deux fichiers sont dans le même format pour éviter les erreurs lors de la comparaison.

    Ensuite, il faut adapter votre rpogramme pour lire les fichiers CSV en utilisant le module csv pour gérer les données de manière structurée.


    Créer un dictionnaire à partir du premier fichier CSV pour stocker les adresses et les SIREN.


    Comparer les adresses du deuxième fichier avec celles du dictionnaire.


    Écrire les adresses communes et leurs SIREN dans le fichier de sortie.

    Un petit programme comme :

    import csv
    
    # Lire le fichier Recherche.csv et créer un dictionnaire pour les adresses et SIREN
    adresses_siren = {}
    with open('Recherche.csv', 'r', encoding='utf-8') as recherche_file:
        reader = csv.reader(recherche_file)
        next(reader)  # Si votre fichier a une ligne d'en-tête, sinon retirez cette ligne
        for row in reader:
            adresse = row[0]
            siren = row[1]
            adresses_siren[adresse] = siren
    
    # Lire le fichier TravailSFE.csv et comparer les adresses avec celles du dictionnaire
    with open('TravailSFE.csv', 'r', encoding='utf-8') as travail_file, \
         open('update.csv', 'w', encoding='utf-8', newline='') as update_file:
        
        reader = csv.reader(travail_file)
        writer = csv.writer(update_file)
        
        # Écrire l'en-tête dans le fichier de sortie si nécessaire
        writer.writerow(['Adresse', 'SIREN'])
        
        for row in reader:
            adresse = row[0]
            if adresse in adresses_siren:
                writer.writerow([adresse, adresses_siren[adresse]])
    
    print("La comparaison est terminée. Les résultats ont été écrits dans 'update.csv'.")
    

    On utilise csv.reader pour lire les fichiers ligne par ligne.
    On passe les en-têtes avec next(reader) si votre fichier a des en-têtes.

    Le dictionnaire adresses_siren associe chaque adresse à son SIREN, facilitant la recherche rapide.

    On vérifie si chaque adresse du fichier TravailSFE.csv est présente dans le dictionnaire.
    Si elle l'est, on écrit l'adresse et le SIREN correspondant dans le fichier update.csv.


    1
    1. Merci beaucoup pour votre réponse

      0
    2. J'ai suivi votre programme mais il m'indique une erreur :

      Traceback (most recent call last):
        File "C:\Users\l.rupert\PycharmProjects\Saleforce\TEST 47.py", line 9, in <module>
          siren = row[1]
                  ~~~^^^
      IndexError: list index out of range

      0
  2. Voilà, j'ai ajouté le contrôle supplémentaire dans le code.

    import csv
    
    # Lire le fichier Recherche.csv et créer un dictionnaire pour les adresses et SIREN
    adresses_siren = {}
    with open('Recherche.csv', 'r', encoding='utf-8') as recherche_file:
        reader = csv.reader(recherche_file)
        next(reader)  # Si votre fichier a une ligne d'en-tête, sinon retirez cette ligne
        for row in reader:
            # Vérifier que la ligne a bien deux colonnes (adresse et SIREN)
            if len(row) < 2:
                print(f"Ligne ignorée (colonne manquante) : {row}")
                continue  # Passer à la ligne suivante si la ligne ne contient pas 2 colonnes
            adresse = row[0]
            siren = row[1]
            adresses_siren[adresse] = siren
    
    # Lire le fichier TravailSFE.csv et comparer les adresses avec celles du dictionnaire
    with open('TravailSFE.csv', 'r', encoding='utf-8') as travail_file, \
         open('update.csv', 'w', encoding='utf-8', newline='') as update_file:
        
        reader = csv.reader(travail_file)
        writer = csv.writer(update_file)
        
        # Écrire l'en-tête dans le fichier de sortie si nécessaire
        writer.writerow(['Adresse', 'SIREN'])
        
        for row in reader:
            if len(row) == 0:  # Vérifier si la ligne est vide
                print(f"Ligne vide ignorée : {row}")
                continue
            adresse = row[0]
            if adresse in adresses_siren:
                writer.writerow([adresse, adresses_siren[adresse]])
    
    print("La comparaison est terminée. Les résultats ont été écrits dans 'update.csv'.")
    

    1
    1. OK

      Le message que vous avez obtenu montre que l'adresse dans le fichier contient des caractères inattendus. Le code ASCII [32, 59, 59, 59, 59] représente les caractères suivants :

      32 : un espace ( ),
      59 : un point-virgule (;).


      Cela indique que certaines lignes dans vos fichiers CSV contiennent des caractères non attendus ou mal formatés, comme des points-virgules successifs (;;;;). Ces caractères peuvent être le résultat d'un formatage incorrect dans le fichier d'origine ou une mauvaise manipulation du fichier CSV.

      Je vais vous re préparer un script. Je vous l'adresse tout à l'heure. 


      1
      1. L'erreur IndexError: list index out of range signifie que le programme tente d'accéder à un élément dans une liste (ici row[1] pour le SIREN), mais que la ligne en question ne contient pas assez d'éléments (colonnes) pour accéder à cet index.

        Cela peut se produire pour plusieurs raisons :

        Certaines lignes dans votre fichier CSV ne contiennent pas deux colonnes.
        Il pourrait y avoir des lignes vides.


        Il peut y avoir des problèmes de formatage dans le fichier (comme des retours à la ligne ou des délimiteurs incorrects).

        Vérifier que chaque ligne a bien deux colonnes dans le fichier Recherche.csv.

        Ajouter des contrôles d'erreur pour gérer les lignes vides ou mal formatées.

        J'ai gardé votre code, je reviens et je vais vous fournir une version du code qui ajoute un contrôle supplémentaire pour vérifier que chaque ligne contient au moins deux colonnes avant de tenter d'accéder aux indices.


        0
        1. Je vous remercie beaucoup pour l'aide que vous m'apporter ????

          0
      2.  
        import csv
        
        adresse_siren = {}
        with open('BDS.csv', 'r', encoding='utf-8') as recherche_file:
            reader = csv.reader(recherche_file)
            next(reader)
            for row in reader:
                adresse = row[0]
                siren = row[1]
                adresse_siren[adresse] = siren
        
        
        with open('BDT.csv', 'r', encoding='utf-8') as travail_file, \
                open('update.csv', 'w', encoding='utf-8', newline='') as update_file:
            reader = csv.reader(travail_file)
            writer = csv.writer(update_file)
        
            writer.writerow(['adresse', 'siren'])
        
            for row in reader:
                adresse = row[0]
                if adresse in adresse_siren:
                    writer.writerow([adresse, adresse_siren[adresse]])
        
        print("La comparaison est terminée. Les résultats ont été écrits dans 'update.csv'.")

        La première image est le CSV de BDS (anciennement recherche) et la deuxième est le CSV de BDT (Travail SFE).

        Je vous ai aussi renvoyé le programme, peut être cela vous permettra d'identifier mieux mon erreur.

        0

        1. Votre programme est très proche du résultat souhaité, mais il pourrait rencontrer quelques problèmes similaires à ceux précédemment mentionnés.

          Il faut vérifier les lignes vides ou mal formatées : Il se pourrait que certains fichiers CSV contiennent des lignes vides ou des lignes avec moins de colonnes que prévu. Il est toujours bon de vérifier avant d'accéder aux indices des colonnes. C'est pour cette raison que j'ai modifié le code avez vous essayez celui-ci :

          import csv
          
          adresse_siren = {}
          
          # Lire le fichier BDS.csv et créer un dictionnaire pour les adresses et SIREN
          with open('BDS.csv', 'r', encoding='utf-8') as recherche_file:
              reader = csv.reader(recherche_file)
              next(reader)  # Passer la ligne d'en-tête si elle existe
              for row in reader:
                  if len(row) < 2:  # Vérifier que la ligne contient au moins 2 colonnes (adresse, siren)
                      print(f"Ligne ignorée (colonne manquante ou mal formatée) : {row}")
                      continue  # Passer les lignes incorrectes
                  adresse = row[0].strip()  # Retirer les espaces superflus
                  siren = row[1].strip()  # Retirer les espaces superflus
                  adresse_siren[adresse] = siren
          
          # Lire le fichier BDT.csv et comparer les adresses avec celles du dictionnaire
          with open('BDT.csv', 'r', encoding='utf-8') as travail_file, \
               open('update.csv', 'w', encoding='utf-8', newline='') as update_file:
              
              reader = csv.reader(travail_file)
              writer = csv.writer(update_file)
          
              writer.writerow(['adresse', 'siren'])  # Écrire l'en-tête dans le fichier de sortie
          
              for row in reader:
                  if len(row) == 0:  # Vérifier si la ligne est vide
                      print(f"Ligne vide ignorée : {row}")
                      continue
                  adresse = row[0].strip()  # Nettoyer les espaces de l'adresse
                  if adresse in adresse_siren:
                      writer.writerow([adresse, adresse_siren[adresse]])
          
          print("La comparaison est terminée. Les résultats ont été écrits dans 'update.csv'.")
          
          0
      3. Je viens d'essayer le nouveau programme : 

        il m'affiche bien les lignes ignorée dans la console python mais le fichier update est vide.

        0

        1. Si le fichier update.csv est vide, cela signifie que le programme n'a trouvé aucune correspondance entre les adresses du fichier BDT.csv et celles du fichier BDS.csv. Cela peut être dû à plusieurs raisons, soit :

          Incohérence dans le format des adresses (ex. : espaces en trop, lettres en majuscules/minuscules, accents).


          Problème de casse (majuscules/minuscules) : les adresses pourraient être écrites différemment dans les deux fichiers, rendant la comparaison impossible.


          Différences subtiles dans les adresses (comme des virgules ou des abréviations différentes, par exemple, "Rue" au lieu de "R.").

          Je vais ajouter une fonction au code avec normalize_string() pour convertir les adresses en minuscules, supprimer les accents (é, è, à, etc.) et les espaces superflus. Cela permet de rendre les adresses des deux fichiers comparables même si elles diffèrent légèrement dans la casse ou les accents.

          Si une adresse du fichier BDT.csv ne correspond à aucune adresse dans BDS.csv, elle sera affichée dans la console. Cela vous aidera à identifier les différences éventuelles.

          Je modifie le code et vous l'adresse. Nous allons y parvenir, ne désespéré pas, ce n'est pour moi qu'une question de formatage.


          0
          1. Voilà, essayez celui-ci maintenant.

            import csv
            import unicodedata
            
            # Fonction pour normaliser les adresses (mettre en minuscules, supprimer les accents)
            def normalize_string(s):
                s = s.strip().lower()  # Retirer les espaces et passer en minuscules
                s = unicodedata.normalize('NFKD', s).encode('ASCII', 'ignore').decode('ASCII')  # Supprimer les accents
                return s
            
            adresse_siren = {}
            
            # Lire le fichier BDS.csv et créer un dictionnaire pour les adresses et SIREN
            with open('BDS.csv', 'r', encoding='utf-8') as recherche_file:
                reader = csv.reader(recherche_file)
                next(reader)  # Passer la ligne d'en-tête si elle existe
                for row in reader:
                    if len(row) < 2:  # Vérifier que la ligne contient au moins 2 colonnes (adresse, siren)
                        print(f"Ligne ignorée (colonne manquante ou mal formatée) : {row}")
                        continue  # Passer les lignes incorrectes
                    adresse = normalize_string(row[0])  # Normaliser l'adresse
                    siren = row[1].strip()  # Retirer les espaces superflus pour le siren
                    adresse_siren[adresse] = siren
            
            # Lire le fichier BDT.csv et comparer les adresses avec celles du dictionnaire
            with open('BDT.csv', 'r', encoding='utf-8') as travail_file, \
                 open('update.csv', 'w', encoding='utf-8', newline='') as update_file:
                
                reader = csv.reader(travail_file)
                writer = csv.writer(update_file)
            
                writer.writerow(['adresse', 'siren'])  # Écrire l'en-tête dans le fichier de sortie
            
                for row in reader:
                    if len(row) == 0:  # Vérifier si la ligne est vide
                        print(f"Ligne vide ignorée : {row}")
                        continue
                    adresse = normalize_string(row[0])  # Normaliser l'adresse dans BDT.csv
                    if adresse in adresse_siren:
                        writer.writerow([row[0], adresse_siren[adresse]])  # Utiliser l'adresse d'origine dans le fichier de sortie
                    else:
                        print(f"Adresse non trouvée : {row[0]}")  # Afficher les adresses qui ne correspondent pas
            
            print("La comparaison est terminée. Les résultats ont été écrits dans 'update.csv'.")
            
            0
          2. @Bruno83200_6929

            Je vais essayer de faire fonctionner ça en tous cas merci pour votre aide 

            0
        2. Le fichier update reste vide même après la modification du programme. 

          Je ne comprends pas pourquoi car j'ai bien vérifier les adresses du fichier BDS correspondent avec celui de BDT 

          0

          1. Si le fichier update.csv reste vide même après les modifications et que vous êtes certaine que les adresses dans les fichiers BDS.csv et BDT.csv correspondent, cela peut indiquer un problème plus subtil, comme une différence imperceptible dans les données (espaces invisibles, différences de formatage, encodage, etc.).

            Nous allons diagnostiquer et résoudre ce problème étape par étape.

            Essayez ce nouveau code :

            import csv
            import unicodedata
            
            # Fonction pour normaliser les adresses (mettre en minuscules, supprimer les accents)
            def normalize_string(s):
                s = s.strip().lower()  # Retirer les espaces et passer en minuscules
                s = unicodedata.normalize('NFKD', s).encode('ASCII', 'ignore').decode('ASCII')  # Supprimer les accents
                return s
            
            adresse_siren = {}
            
            # Lire le fichier BDS.csv et créer un dictionnaire pour les adresses et SIREN
            with open('BDS.csv', 'r', encoding='utf-8') as recherche_file:
                reader = csv.reader(recherche_file)
                next(reader)  # Passer la ligne d'en-tête si elle existe
                for row in reader:
                    if len(row) < 2:  # Vérifier que la ligne contient au moins 2 colonnes (adresse, siren)
                        print(f"Ligne ignorée (colonne manquante ou mal formatée) : {row}")
                        continue  # Passer les lignes incorrectes
                    adresse = normalize_string(row[0])  # Normaliser l'adresse
                    siren = row[1].strip()  # Retirer les espaces superflus pour le siren
                    print(f"Ajout au dictionnaire : {row[0]} -> {siren} (normalisé : {adresse})")
                    adresse_siren[adresse] = siren
            
            # Lire le fichier BDT.csv et comparer les adresses avec celles du dictionnaire
            with open('BDT.csv', 'r', encoding='utf-8') as travail_file, \
                 open('update.csv', 'w', encoding='utf-8', newline='') as update_file:
                
                reader = csv.reader(travail_file)
                writer = csv.writer(update_file)
            
                writer.writerow(['adresse', 'siren'])  # Écrire l'en-tête dans le fichier de sortie
            
                for row in reader:
                    if len(row) == 0:  # Vérifier si la ligne est vide
                        print(f"Ligne vide ignorée : {row}")
                        continue
                    adresse = normalize_string(row[0])  # Normaliser l'adresse dans BDT.csv
                    print(f"Comparaison de : {row[0]} (normalisé : {adresse})")
                    if adresse in adresse_siren:
                        print(f"Adresse correspondante trouvée : {row[0]} -> {adresse_siren[adresse]}")
                        writer.writerow([row[0], adresse_siren[adresse]])  # Utiliser l'adresse d'origine dans le fichier de sortie
                    else:
                        print(f"Adresse non trouvée : {row[0]} (normalisé : {adresse})")
            
            print("La comparaison est terminée. Les résultats ont été écrits dans 'update.csv'.")
            

            Exécutez ce script et observez les lignes dans la console.

            Si les adresses ne correspondent toujours pas malgré la normalisation, vérifiez que les fichiers BDS.csv et BDT.csv utilisent bien le même encodage (UTF-8, par exemple).


            Si nécessaire, essayez de forcer l'encodage lors de l'ouverture des fichiers avec 'utf-8-sig' en ajoutant cette ligne :

            with open('BDS.csv', 'r', encoding='utf-8-sig') as recherche_file:
            

            Voir ajouter celle-ci également pour révéler d'éventuels caractères invisibles :

            print(f"Adresse originale (code ASCII) : {[ord(c) for c in row[0]]}")
            

            Une fois que vous aurez identifié le problème, nous pourrons ajuster le programme en fonction de ces informations.

            0
          2. @Bruno83200_6929

            Après toutes les modifications le problème reste le même et la console m'affiche ce message : 

            Adresse originale (code ASCII) : [32, 59, 59, 59, 59]

            0
        3. Okay je comprends 

          Pas de soucis a tout à l'heure et Merci beaucoup.

          0
          1. Modérateur

            Bonjour,

            Afin que tout un chacun puisse tester les programmes proposés, serait-il possible de partager les fichiers CSV en question ?

            As-tu considéré pandas ? Outre le fait qu'il est possible de charger facilement des fichiers csv (voir pd.read_csv), pandas fournit ne nombreuses primitives très  performantes pour manipuler les données. Si j'ai bien compris, le but est ici de trouver une jointure entre les deux fichiers selon la colonne siren (si c'est le cas, tu peux utiliser pd.join). Pour exporter une dataframe, utilise la méthode to_csv.

            Exemple :

            fichier1.csv

            nom,prenom,siren
            solo,han,1111
            skywalker,luke,1111
            the hutt,jabba,0
            vador,dark,333

            fichier2.csv

            siren,cause
            1111,rebellion
            333,empire

            toto.py

            #!/usr/bin/env python3
            
            import pandas as pd
            
            df1 = pd.read_csv("fichier1.csv")
            print(df1)
            print("-" * 50)
            df2 = pd.read_csv("fichier2.csv")
            print(df2)
            print("-" * 50)
            df = df1.set_index("siren").join(df2.set_index("siren"))
            print(df)
            print("-" * 50)
            print(df.to_csv()

            Résultat :

                     nom prenom  siren
            0       solo    han   1111
            1  skywalker   luke   1111
            2   the hutt  jabba      0
            3      vador   dark    333
            --------------------------------------------------
               siren      cause
            0   1111  rebellion
            1    333     empire
            --------------------------------------------------
                         nom prenom      cause
            siren                             
            1111        solo    han  rebellion
            1111   skywalker   luke  rebellion
            0       the hutt  jabba        NaN
            333        vador   dark     empire
            --------------------------------------------------
            siren,nom,prenom,cause
            1111,solo,han,rebellion
            1111,skywalker,luke,rebellion
            0,the hutt,jabba,
            333,vador,dark,empire

            Bonne chance

            0
            1. Merci pour votre réponse mais malheureusement je ne peux pas partager les fichiers car ceux sont des contacts d'entreprise.

              Mais je vais essayer de réfléchir avec la fonction pandas 

              Merci beaucoup 

              0
              1. Les points-virgules pourraient être présents au lieu de colonnes valides, ce qui signifie que les fichiers CSV ne sont pas correctement structurés ou mal lus.

                Voici le code modifié pour utiliser le point-virgule comme séparateur, au cas où ce serait le cas dans vos fichiers :

                import csv
                import unicodedata
                
                # Fonction pour normaliser les adresses (mettre en minuscules, supprimer les accents)
                def normalize_string(s):
                    s = s.strip().lower()  # Retirer les espaces et passer en minuscules
                    s = unicodedata.normalize('NFKD', s).encode('ASCII', 'ignore').decode('ASCII')  # Supprimer les accents
                    return s
                
                adresse_siren = {}
                
                # Lire le fichier BDS.csv avec le séparateur point-virgule
                with open('BDS.csv', 'r', encoding='utf-8') as recherche_file:
                    reader = csv.reader(recherche_file, delimiter=';')  # Spécifier le séparateur
                    next(reader)  # Passer la ligne d'en-tête si elle existe
                    for row in reader:
                        if len(row) < 2:  # Vérifier que la ligne contient au moins 2 colonnes (adresse, siren)
                            print(f"Ligne ignorée (colonne manquante ou mal formatée) : {row}")
                            continue  # Passer les lignes incorrectes
                        adresse = normalize_string(row[0])  # Normaliser l'adresse
                        siren = row[1].strip()  # Retirer les espaces superflus pour le siren
                        print(f"Ajout au dictionnaire : {row[0]} -> {siren} (normalisé : {adresse})")
                        adresse_siren[adresse] = siren
                
                # Lire le fichier BDT.csv avec le séparateur point-virgule et comparer les adresses
                with open('BDT.csv', 'r', encoding='utf-8') as travail_file, \
                     open('update.csv', 'w', encoding='utf-8', newline='') as update_file:
                    
                    reader = csv.reader(travail_file, delimiter=';')  # Spécifier le séparateur
                    writer = csv.writer(update_file)
                
                    writer.writerow(['adresse', 'siren'])  # Écrire l'en-tête dans le fichier de sortie
                
                    for row in reader:
                        if len(row) == 0:  # Vérifier si la ligne est vide
                            print(f"Ligne vide ignorée : {row}")
                            continue
                        adresse = normalize_string(row[0])  # Normaliser l'adresse dans BDT.csv
                        print(f"Comparaison de : {row[0]} (normalisé : {adresse})")
                        if adresse in adresse_siren:
                            print(f"Adresse correspondante trouvée : {row[0]} -> {adresse_siren[adresse]}")
                            writer.writerow([row[0], adresse_siren[adresse]])  # Utiliser l'adresse d'origine dans le fichier de sortie
                        else:
                            print(f"Adresse non trouvée : {row[0]} (normalisé : {adresse})")
                
                print("La comparaison est terminée. Les résultats ont été écrits dans 'update.csv'.")
                

                Si vos fichiers utilisent le point-virgule comme séparateur (ce qui semble être le cas vu les caractères ;;;;), cela permet au programme de correctement lire les colonnes des fichiers.

                Si cette solution ne fonctionne pas, il pourrait être utile de vérifier manuellement les fichiers CSV pour vous assurer que les colonnes sont bien séparées par des virgules ou des points-virgules.


                Si vos fichiers ne sont pas bien structurés, essayez de les réexporter avec un outil comme Excel ou un éditeur de texte pour vous assurer qu'ils respectent le format CSV correct (avec des séparateurs clairs).

                La manipulation des fichiers CSV est toujours très délicate, les erreurs sont souvent liées au formatage des fichiers. Il est toujours plus judicieux d'utiliser des outils comme Excel et LibreOffice Calc (qui est gratuit et open source) qui sont des tableurs populaires pour manipuler des fichiers CSV. Si vous n'y parvenez pas avec python, je vous conseille d'utiliser un de ces tableurs.

                Vous pouvez copier/coller les adresses d'un fichier dans un nouveau tableau, puis utiliser des formules comme RECHERCHEV pour associer les SIREN aux adresses correspondantes.

                Exemple de formule RECHERCHEV :

                =RECHERCHEV(A2;BDS!A:B;2;FAUX)
                 

                Je ne sais plus quelle solution vous apporter.


                0
                1. Le programme à fonctionné , je vous remercie de votre aide.

                  j'aurais une dernière requête : j'aimerais que le code client s'affiche aussi avec le siren associé ( je sais pas si c'est très clair ) 

                  0
              2. Avec le code nic aussi 

                0
                1. Pour ajouter le code client et le code NIC à vos résultats, vous pouvez les intégrer à la structure du fichier CSV d'entrée (BDS.csv ou BDT.csv, selon la source des données). Voici comment vous pouvez les ajouter à votre fichier de résultats.

                  Le fichier BDS.csv contient, en plus des adresses et des SIREN, les colonnes code client et code NIC.


                  Il faut extraire ces deux nouvelles colonnes et les ajouter au fichier update.csv.

                  import csv
                  import unicodedata
                  
                  # Fonction pour normaliser les adresses (mettre en minuscules, supprimer les accents)
                  def normalize_string(s):
                      s = s.strip().lower()  # Retirer les espaces et passer en minuscules
                      s = unicodedata.normalize('NFKD', s).encode('ASCII', 'ignore').decode('ASCII')  # Supprimer les accents
                      return s
                  
                  adresse_siren = {}
                  
                  # Lire le fichier BDS.csv avec le séparateur point-virgule
                  with open('BDS.csv', 'r', encoding='utf-8') as recherche_file:
                      reader = csv.reader(recherche_file, delimiter=';')  # Spécifier le séparateur, modifiez-le si nécessaire
                      next(reader)  # Passer la ligne d'en-tête si elle existe
                      for row in reader:
                          if len(row) < 4:  # Vérifier que la ligne contient au moins 4 colonnes (adresse, siren, code client, code NIC)
                              print(f"Ligne ignorée (colonne manquante ou mal formatée) : {row}")
                              continue  # Passer les lignes incorrectes
                          adresse = normalize_string(row[0])  # Normaliser l'adresse
                          siren = row[1].strip()  # SIREN
                          code_client = row[2].strip()  # Code client
                          code_nic = row[3].strip()  # Code NIC
                          print(f"Ajout au dictionnaire : {row[0]} -> SIREN: {siren}, Code Client: {code_client}, Code NIC: {code_nic} (normalisé : {adresse})")
                          adresse_siren[adresse] = (siren, code_client, code_nic)  # Ajouter un tuple avec SIREN, code client, et code NIC
                  
                  # Lire le fichier BDT.csv et comparer les adresses
                  with open('BDT.csv', 'r', encoding='utf-8') as travail_file, \
                       open('update.csv', 'w', encoding='utf-8', newline='') as update_file:
                      
                      reader = csv.reader(travail_file, delimiter=';')  # Spécifier le séparateur
                      writer = csv.writer(update_file)
                  
                      # Écrire l'en-tête dans le fichier de sortie
                      writer.writerow(['adresse', 'siren', 'code_client', 'code_nic'])
                  
                      for row in reader:
                          if len(row) == 0:  # Vérifier si la ligne est vide
                              print(f"Ligne vide ignorée : {row}")
                              continue
                          adresse = normalize_string(row[0])  # Normaliser l'adresse dans BDT.csv
                          print(f"Comparaison de : {row[0]} (normalisé : {adresse})")
                          if adresse in adresse_siren:
                              siren, code_client, code_nic = adresse_siren[adresse]
                              print(f"Adresse correspondante trouvée : {row[0]} -> SIREN: {siren}, Code Client: {code_client}, Code NIC: {code_nic}")
                              writer.writerow([row[0], siren, code_client, code_nic])  # Utiliser l'adresse d'origine et ajouter les autres colonnes
                          else:
                              print(f"Adresse non trouvée : {row[0]} (normalisé : {adresse})")
                  
                  print("La comparaison est terminée. Les résultats ont été écrits dans 'update.csv'.")
                  

                  Le fichier BDS.csv doit être organisé ainsi :

                  adresse;siren;code_client;code_nic
                  Adresse 1;123456789;CL12345;NIC001
                  Adresse 2;987654321;CL54321;NIC002
                  

                  Et le fichier BDT.csv devrait avoir au moins la colonne adresse :

                  adresse
                  Adresse 1
                  Adresse 2
                  

                  Le fichier update.csv contiendra les adresses correspondantes, avec le SIREN, le code client et le code NIC associés :

                  adresse,siren,code_client,code_nic
                  Adresse 1,123456789,CL12345,NIC001
                  Adresse 2,987654321,CL54321,NIC002
                  

                  Ce code vous permet maintenant de comparer les adresses tout en extrayant les informations associées comme le SIREN, le code client et le code NIC dans le fichier de sortie.

                  0
                2. @Bruno83200_6929

                  Alors dans le fichier BDT il y a l'adresse et le code client et le BDS il y l'adresse le siren et le nic

                  0
                3. @Lisana_69

                  Merci pour la précision, alors voilà en fonction de ces éléments :

                  import csv
                  import unicodedata
                  
                  # Fonction pour normaliser les adresses (mettre en minuscules, supprimer les accents)
                  def normalize_string(s):
                      s = s.strip().lower()  # Retirer les espaces et passer en minuscules
                      s = unicodedata.normalize('NFKD', s).encode('ASCII', 'ignore').decode('ASCII')  # Supprimer les accents
                      return s
                  
                  adresse_siren_nic = {}
                  
                  # Lire le fichier BDS.csv (avec adresse, siren, nic)
                  with open('BDS.csv', 'r', encoding='utf-8') as recherche_file:
                      reader = csv.reader(recherche_file, delimiter=';')  # Spécifier le séparateur, modifiez-le si nécessaire
                      next(reader)  # Passer la ligne d'en-tête si elle existe
                      for row in reader:
                          if len(row) < 3:  # Vérifier que la ligne contient au moins 3 colonnes (adresse, siren, nic)
                              print(f"Ligne ignorée (colonne manquante ou mal formatée) : {row}")
                              continue  # Passer les lignes incorrectes
                          adresse = normalize_string(row[0])  # Normaliser l'adresse
                          siren = row[1].strip()  # SIREN
                          nic = row[2].strip()  # Code NIC
                          print(f"Ajout au dictionnaire : {row[0]} -> SIREN: {siren}, NIC: {nic} (normalisé : {adresse})")
                          adresse_siren_nic[adresse] = (siren, nic)  # Stocker SIREN et NIC dans le dictionnaire
                  
                  # Lire le fichier BDT.csv (avec adresse, code client) et comparer les adresses
                  with open('BDT.csv', 'r', encoding='utf-8') as travail_file, \
                       open('update.csv', 'w', encoding='utf-8', newline='') as update_file:
                      
                      reader = csv.reader(travail_file, delimiter=';')  # Spécifier le séparateur
                      writer = csv.writer(update_file)
                  
                      # Écrire l'en-tête dans le fichier de sortie
                      writer.writerow(['adresse', 'code_client', 'siren', 'nic'])
                  
                      for row in reader:
                          if len(row) < 2:  # Vérifier que la ligne contient au moins 2 colonnes (adresse, code client)
                              print(f"Ligne ignorée (colonne manquante ou mal formatée) : {row}")
                              continue
                          adresse = normalize_string(row[0])  # Normaliser l'adresse dans BDT.csv
                          code_client = row[1].strip()  # Code client
                          print(f"Comparaison de : {row[0]} (normalisé : {adresse}) avec le code client : {code_client}")
                          
                          if adresse in adresse_siren_nic:  # Si l'adresse correspond
                              siren, nic = adresse_siren_nic[adresse]
                              print(f"Adresse correspondante trouvée : {row[0]} -> SIREN: {siren}, NIC: {nic}")
                              writer.writerow([row[0], code_client, siren, nic])  # Utiliser l'adresse d'origine et ajouter les autres colonnes
                          else:
                              print(f"Adresse non trouvée : {row[0]} (normalisé : {adresse})")
                  
                  print("La comparaison est terminée. Les résultats ont été écrits dans 'update.csv'.")
                  
                  1
                4. @Bruno83200_6929

                  Je vous remercie pour le temps que vous avez pris à m'aidez pour la création de ce programme.

                  Tout est fonctionnel il ne me reste plus qu'a nettoyer les Bases de données afin de trouver plus de siren.

                  Passez une bonne journée.

                  et peut-être que nous aurons l'occasion d'échanger à nouveau sur d'autres programme Python.

                  0
                5. @Lisana_69

                  Ce fut avec un grand plaisir !!!

                  1