Comparer deux fichiers CSV avec Python
RésoluBruno83200_6929 Messages postés 282 Date d'inscription jeudi 18 juin 2020 Statut Membre Dernière intervention 23 octobre 2024 - 20 sept. 2024 à 14:49
- Comparer deux fichiers CSV avec Python
- Fusionner deux fichiers excel - Guide
- Wetransfer gratuit fichiers lourd - Guide
- Citizen code python - Accueil - Outils
- Deux ecran pc - Guide
- Renommer plusieurs fichiers - Guide
13 réponses
19 sept. 2024 à 15:11
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.
20 sept. 2024 à 09:34
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'.")
20 sept. 2024 à 12:39
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.
20 sept. 2024 à 09:29
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.
20 sept. 2024 à 09:58
Je vous remercie beaucoup pour l'aide que vous m'apporter ????
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionModifié le 20 sept. 2024 à 09:57
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.
20 sept. 2024 à 10:05
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'.")
20 sept. 2024 à 10:17
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.
20 sept. 2024 à 10:25
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.
20 sept. 2024 à 10:30
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'.")
20 sept. 2024 à 11:49
Je vais essayer de faire fonctionner ça en tous cas merci pour votre aide
20 sept. 2024 à 10:40
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
20 sept. 2024 à 12:21
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.
20 sept. 2024 à 12:36
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]
20 sept. 2024 à 12:41
Okay je comprends
Pas de soucis a tout à l'heure et Merci beaucoup.
Modifié le 20 sept. 2024 à 13:57
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
20 sept. 2024 à 13:57
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
20 sept. 2024 à 14:02
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.
20 sept. 2024 à 14:07
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 )
20 sept. 2024 à 14:09
Avec le code nic aussi
20 sept. 2024 à 14:25
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.
20 sept. 2024 à 14:29
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
20 sept. 2024 à 14:33
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'.")
20 sept. 2024 à 14:48
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.
20 sept. 2024 à 14:49
Ce fut avec un grand plaisir !!!
20 sept. 2024 à 09:12
Merci beaucoup pour votre réponse
20 sept. 2024 à 09:25
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