Comparer deux fichiers CSV avec Python

Résolu
Lisana - Modifié le 20 sept. 2024 à 13:32
Bruno83200_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

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

A voir également:

13 réponses

Bruno83200_6929 Messages postés 282 Date d'inscription jeudi 18 juin 2020 Statut Membre Dernière intervention 23 octobre 2024 56
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.


1
Lisana_69 Messages postés 19 Date d'inscription mercredi 8 juin 2022 Statut Membre Dernière intervention 31 octobre 2024
20 sept. 2024 à 09:12

Merci beaucoup pour votre réponse

0
Lisana_69 Messages postés 19 Date d'inscription mercredi 8 juin 2022 Statut Membre Dernière intervention 31 octobre 2024
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

0
Bruno83200_6929 Messages postés 282 Date d'inscription jeudi 18 juin 2020 Statut Membre Dernière intervention 23 octobre 2024 56
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'.")

1
Bruno83200_6929 Messages postés 282 Date d'inscription jeudi 18 juin 2020 Statut Membre Dernière intervention 23 octobre 2024 56
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. 


1
Bruno83200_6929 Messages postés 282 Date d'inscription jeudi 18 juin 2020 Statut Membre Dernière intervention 23 octobre 2024 56
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.


0
Lisana_69 Messages postés 19 Date d'inscription mercredi 8 juin 2022 Statut Membre Dernière intervention 31 octobre 2024
20 sept. 2024 à 09:58

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

0

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

Posez votre question
Lisana_69 Messages postés 19 Date d'inscription mercredi 8 juin 2022 Statut Membre Dernière intervention 31 octobre 2024
Modifié 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.

0
Bruno83200_6929 Messages postés 282 Date d'inscription jeudi 18 juin 2020 Statut Membre Dernière intervention 23 octobre 2024 56
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'.")
0
Lisana_69 Messages postés 19 Date d'inscription mercredi 8 juin 2022 Statut Membre Dernière intervention 31 octobre 2024
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.

0
Bruno83200_6929 Messages postés 282 Date d'inscription jeudi 18 juin 2020 Statut Membre Dernière intervention 23 octobre 2024 56
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.


0
Bruno83200_6929 Messages postés 282 Date d'inscription jeudi 18 juin 2020 Statut Membre Dernière intervention 23 octobre 2024 56
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'.")
0
Lisana_69 Messages postés 19 Date d'inscription mercredi 8 juin 2022 Statut Membre Dernière intervention 31 octobre 2024 > Bruno83200_6929 Messages postés 282 Date d'inscription jeudi 18 juin 2020 Statut Membre Dernière intervention 23 octobre 2024
20 sept. 2024 à 11:49

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

0
Lisana_69 Messages postés 19 Date d'inscription mercredi 8 juin 2022 Statut Membre Dernière intervention 31 octobre 2024
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 

0
Bruno83200_6929 Messages postés 282 Date d'inscription jeudi 18 juin 2020 Statut Membre Dernière intervention 23 octobre 2024 56
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.

0
Lisana_69 Messages postés 19 Date d'inscription mercredi 8 juin 2022 Statut Membre Dernière intervention 31 octobre 2024 > Bruno83200_6929 Messages postés 282 Date d'inscription jeudi 18 juin 2020 Statut Membre Dernière intervention 23 octobre 2024
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]

0
Lisana_69 Messages postés 19 Date d'inscription mercredi 8 juin 2022 Statut Membre Dernière intervention 31 octobre 2024
20 sept. 2024 à 12:41

Okay je comprends 

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

0
mamiemando Messages postés 33346 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 8 novembre 2024 7 803
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

0
Lisana_69 Messages postés 19 Date d'inscription mercredi 8 juin 2022 Statut Membre Dernière intervention 31 octobre 2024
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 

0
Bruno83200_6929 Messages postés 282 Date d'inscription jeudi 18 juin 2020 Statut Membre Dernière intervention 23 octobre 2024 56
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.


0
Lisana_69 Messages postés 19 Date d'inscription mercredi 8 juin 2022 Statut Membre Dernière intervention 31 octobre 2024
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 ) 

0
Lisana_69 Messages postés 19 Date d'inscription mercredi 8 juin 2022 Statut Membre Dernière intervention 31 octobre 2024
20 sept. 2024 à 14:09

Avec le code nic aussi 

0
Bruno83200_6929 Messages postés 282 Date d'inscription jeudi 18 juin 2020 Statut Membre Dernière intervention 23 octobre 2024 56
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.

0
Lisana_69 Messages postés 19 Date d'inscription mercredi 8 juin 2022 Statut Membre Dernière intervention 31 octobre 2024 > Bruno83200_6929 Messages postés 282 Date d'inscription jeudi 18 juin 2020 Statut Membre Dernière intervention 23 octobre 2024
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

0
Bruno83200_6929 Messages postés 282 Date d'inscription jeudi 18 juin 2020 Statut Membre Dernière intervention 23 octobre 2024 56 > Lisana_69 Messages postés 19 Date d'inscription mercredi 8 juin 2022 Statut Membre Dernière intervention 31 octobre 2024
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'.")
1
Lisana_69 Messages postés 19 Date d'inscription mercredi 8 juin 2022 Statut Membre Dernière intervention 31 octobre 2024 > Bruno83200_6929 Messages postés 282 Date d'inscription jeudi 18 juin 2020 Statut Membre Dernière intervention 23 octobre 2024
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.

0
Bruno83200_6929 Messages postés 282 Date d'inscription jeudi 18 juin 2020 Statut Membre Dernière intervention 23 octobre 2024 56 > Lisana_69 Messages postés 19 Date d'inscription mercredi 8 juin 2022 Statut Membre Dernière intervention 31 octobre 2024
20 sept. 2024 à 14:49

Ce fut avec un grand plaisir !!!

1