Comparer deux fichiers CSV avec Python

Résolu
Lisana -  
Bruno83200_6929 Messages postés 725 Date d'inscription   Statut Membre Dernière intervention   -

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

  1. Bruno83200_6929 Messages postés 725 Date d'inscription   Statut Membre Dernière intervention   170
     

    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. Lisana_69 Messages postés 20 Statut Membre
       

      Merci beaucoup pour votre réponse

      0
    2. Lisana_69 Messages postés 20 Statut Membre
       

      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. Bruno83200_6929 Messages postés 725 Date d'inscription   Statut Membre Dernière intervention   170
     

    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
  3. Bruno83200_6929 Messages postés 725 Date d'inscription   Statut Membre Dernière intervention   170
     

    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
  4. Bruno83200_6929 Messages postés 725 Date d'inscription   Statut Membre Dernière intervention   170
     

    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. Lisana_69 Messages postés 20 Statut Membre
       

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

      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Lisana_69 Messages postés 20 Statut Membre
     
     
    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. Bruno83200_6929 Messages postés 725 Date d'inscription   Statut Membre Dernière intervention   170
       


      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
  7. Lisana_69 Messages postés 20 Statut Membre
     

    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
  8. Bruno83200_6929 Messages postés 725 Date d'inscription   Statut Membre Dernière intervention   170
     


    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. Bruno83200_6929 Messages postés 725 Date d'inscription   Statut Membre Dernière intervention   170
       

      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
      1. Lisana_69 Messages postés 20 Statut Membre > Bruno83200_6929 Messages postés 725 Date d'inscription   Statut Membre Dernière intervention  
         

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

        0
  9. Lisana_69 Messages postés 20 Statut Membre
     

    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. Bruno83200_6929 Messages postés 725 Date d'inscription   Statut Membre Dernière intervention   170
       


      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
      1. Lisana_69 Messages postés 20 Statut Membre > Bruno83200_6929 Messages postés 725 Date d'inscription   Statut Membre Dernière intervention  
         

        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
  10. Lisana_69 Messages postés 20 Statut Membre
     

    Okay je comprends 

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

    0
  11. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
     

    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
  12. Lisana_69 Messages postés 20 Statut Membre
     

    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
  13. Bruno83200_6929 Messages postés 725 Date d'inscription   Statut Membre Dernière intervention   170
     

    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. Lisana_69 Messages postés 20 Statut Membre
       

      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
  14. Lisana_69 Messages postés 20 Statut Membre
     

    Avec le code nic aussi 

    0
    1. Bruno83200_6929 Messages postés 725 Date d'inscription   Statut Membre Dernière intervention   170
       

      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
      1. Lisana_69 Messages postés 20 Statut Membre > Bruno83200_6929 Messages postés 725 Date d'inscription   Statut Membre Dernière intervention  
         

        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
      2. Bruno83200_6929 Messages postés 725 Date d'inscription   Statut Membre Dernière intervention   170 > Lisana_69 Messages postés 20 Statut Membre
         

        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
      3. Lisana_69 Messages postés 20 Statut Membre > Bruno83200_6929 Messages postés 725 Date d'inscription   Statut Membre Dernière intervention  
         

        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
      4. Bruno83200_6929 Messages postés 725 Date d'inscription   Statut Membre Dernière intervention   170 > Lisana_69 Messages postés 20 Statut Membre
         

        Ce fut avec un grand plaisir !!!

        1