Comparar dos archivos CSV con Python

Resuelto
Lisana -  
Bruno83200_6929 Mensajes publicados 725 Fecha de registro   Estado Miembro Última intervención   -

¿Podrías ayudarme a comparar dos archivos CSV para extraer las similitudes en otro archivo, pero en este momento el programa me devuelve la información de los dos archivos?

Aquí está el programa:

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)

Para explicarles, el archivo Recherche contiene en la primera columna las direcciones de las empresas y en la segunda columna los SIREN de las empresas. 

Y el archivo travail contiene solo las direcciones y, por lo tanto, me gustaría que el archivo update me devuelva las direcciones que son similares para poder obtener los SIREN (no sé si es muy claro ;) )

Si pueden ayudarme, se lo agradecería. 

13 respuestas

  1. Bruno83200_6929 Mensajes publicados 725 Fecha de registro   Estado Miembro Última intervención   170
     

    Hola,

    Si he entendido bien lo que quieres hacer. Tienes dos archivos CSV: uno contiene las direcciones de empresas con sus SIREN, y el otro contiene sólo las direcciones. Quieres crear un archivo de salida con las direcciones en común y los SIREN correspondientes.

    Si es así, primero debes verificar que los archivos CSV estén correctamente formateados y que las direcciones en ambos archivos tengan el mismo formato para evitar errores durante la comparación.

    Luego, hay que adaptar tu programa para leer los archivos CSV usando el módulo csv para gestionar los datos de manera estructurada.


    Crear un diccionario a partir del primer archivo CSV para almacenar las direcciones y los SIREN.


    Comparar las direcciones del segundo archivo con las del diccionario.


    Escribir las direcciones comunes y sus SIREN en el archivo de salida.

    Un pequeño programa como:

    import csv # Leer el archivo Recherche.csv y crear un diccionario para las direcciones y SIREN direcciones_siren = {} with open('Recherche.csv', 'r', encoding='utf-8') as recherche_file: reader = csv.reader(recherche_file) next(reader) # Si tu archivo tiene una fila de cabeceras, de lo contrario elimina esta línea for row in reader: adresse = row[0] siren = row[1] adresses_siren[adresse] = siren # Leer el archivo TravailSFE.csv y comparar las direcciones con las del diccionario 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) # Escribir la cabecera en el archivo de salida si es necesario 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'.") 

    Se utiliza csv.reader para leer los archivos línea por línea.
    Se omite la cabecera con next(reader) si tu archivo tiene cabeceras.

    El diccionario adresses_siren asocia cada dirección con su SIREN, facilitando la búsqueda rápida.

    Se verifica si cada dirección del archivo TravailSFE.csv está presente en el diccionario.
    Si lo está, se escribe la dirección y el SIREN correspondiente en el archivo update.csv.


    1
    1. Lisana_69 Mensajes publicados 20 Estado Miembro
       
      Muchas gracias por su respuesta
      0
    2. Lisana_69 Mensajes publicados 20 Estado Miembro
       

      He seguido su programa pero me indica un error:

      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 Mensajes publicados 725 Fecha de registro   Estado Miembro Última intervención   170
     

    He añadido el control adicional en el código.

    import csv # Leer el archivo Recherche.csv y crear un diccionario para las direcciones y SIREN adresses_siren = {} with open('Recherche.csv', 'r', encoding='utf-8') as recherche_file: reader = csv.reader(recherche_file) next(reader) # Si su archivo tiene una fila de encabezado, de lo contrario quite esta línea for row in reader: # Verificar que la fila tenga dos columnas (dirección y SIREN) if len(row) < 2: print(f\"Línea ignorada (columna faltante) : {row}\") continue # Pasar a la siguiente línea si la fila no contiene 2 columnas adresse = row[0] siren = row[1] adresses_siren[adresse] = siren # Leer el archivo TravailSFE.csv y comparar las direcciones con las del diccionario 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) # Escribir el encabezado en el archivo de salida si es necesario writer.writerow(['Adresse', 'SIREN']) for row in reader: if len(row) == 0: # Verificar si la fila está vacía print(f\"Línea vacía ignorada : {row}\") continue adresse = row[0] if adresse in adresses_siren: writer.writerow([adresse, adresses_siren[adresse]]) print(\"La comparación ha terminado. Los resultados se han escrito en 'update.csv'.\") 

    1
  3. Bruno83200_6929 Mensajes publicados 725 Fecha de registro   Estado Miembro Última intervención   170
     

    OK

    El mensaje que obtuviste muestra que la dirección en el archivo contiene caracteres inesperados. El código ASCII [32, 59, 59, 59, 59] representa los siguientes caracteres:

    32: un espacio ( ),
    59: un punto y coma (;).


    Esto indica que algunas líneas en tus archivos CSV contienen caracteres no esperados o mal formateados, como puntos y comas consecutivos (;;;;). Estos caracteres pueden ser el resultado de un formato incorrecto en el archivo original o de un manejo indebido del archivo CSV.

    Voy a prepararte de nuevo un script. Te lo enviaré más tarde. 


    1
  4. Bruno83200_6929 Mensajes publicados 725 Fecha de registro   Estado Miembro Última intervención   170
     

    El error IndexError: list index out of range significa que el programa intenta acceder a un elemento en una lista (aquí row[1] para el SIREN), pero la fila en cuestión no contiene suficientes elementos (columnas) para acceder a ese índice.

    Esto puede ocurrir por varias razones:

    Algunas filas en su archivo CSV no contienen dos columnas.
    Podría haber filas vacías.


    Podría haber problemas de formato en el archivo (como saltos de línea o delimitadores incorrectos).

    Verifique que cada fila tenga bien dos columnas en el archivo Recherche.csv.

    Añadir controles de error para manejar las filas vacías o mal formateadas.

    He mantenido su código, regreso y voy a proporcionarle una versión del código que añade un control adicional para verificar que cada fila contiene al menos dos columnas antes de intentar acceder a los índices.


    0
    1. Lisana_69 Mensajes publicados 20 Estado Miembro
       

      Muchas gracias por la ayuda que me has prestado ????

      0
  5. Lisana_69 Mensajes publicados 20 Estado Miembro
     
     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']) pour row dans reader: adresse = row[0] si adresse dans 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 Mensajes publicados 725 Fecha de registro   Estado Miembro Última intervención   170
       


      Su programa está muy cerca del resultado deseado, pero podría encontrar algunos problemas similares a los mencionados anteriormente.

      Es necesario verificar las líneas vacías o mal formateadas: podría haber archivos CSV con líneas vacías o con menos columnas de las previstas. Siempre es buena idea comprobar antes de acceder a los índices de las columnas. Por eso modifiqué el código; ¿has probado éste?

      import csv
      adresse_siren = {}
      # Leer el archivo BDS.csv y crear un diccionario para las direcciones y SIREN
      with open('BDS.csv', 'r', encoding='utf-8') as recherche_file:
          reader = csv.reader(recherche_file)
          next(reader)  # Pasar la línea de encabezado si existe
          for row in reader:
              if len(row) < 2:  # Verificar que la línea contiene al menos 2 columnas (dirección, siren)
                  print(f"Línea ignorada (columna faltante o mal formateada) : {row}")
                  continue  # Pasar las líneas incorrectas
              adresse = row[0].strip()  # Quitar espacios innecesarios
              siren = row[1].strip()  # Quitar espacios innecesarios
              adresse_siren[adresse] = siren
      
      # Leer el archivo BDT.csv y comparar las direcciones con las del diccionario
      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'])  # Escribir el encabezado en el archivo de salida
          for row in reader:
              if len(row) == 0:  # Verificar si la línea está vacía
                  print(f"Línea vacía ignorada : {row}")
                  continue
              adresse = row[0].strip()  # Limpiar los espacios de la dirección
              if adresse in adresse_siren:
                  writer.writerow([adresse, adresse_siren[adresse]])
      print("La comparación ha finalizado. Los resultados han sido escritos en 'update.csv'.")
      0
  6. Lisana_69 Mensajes publicados 20 Estado Miembro
     

    Acabo de probar el nuevo programa:

    la consola de Python muestra bien las líneas ignoradas, pero el archivo de actualización está vacío.

    0
  7. Bruno83200_6929 Mensajes publicados 725 Fecha de registro   Estado Miembro Última intervención   170
     


    Si el archivo update.csv está vacío, significa que el programa no encontró ninguna correspondencia entre las direcciones del archivo BDT.csv y las del archivo BDS.csv. Esto puede deberse a varias razones, ya sea:

    Incoherencia en el formato de direcciones (por ejemplo: espacios de más, letras en mayúsculas/minúsculas, acentos).


    Problema de mayúsculas (mayúsculas/minúsculas): las direcciones podrían estar escritas de forma diferente en los dos archivos, haciendo imposible la comparación.


    Diferencias sutiles en las direcciones (como comas o abreviaturas distintas, por ejemplo, "Rue" en lugar de "R.").

    Voy a añadir una función al código con normalize_string() para convertir las direcciones a minúsculas, eliminar acentos (é, è, à, etc.) y espacios extra. Esto permite que las direcciones de ambos archivos sean comparables incluso si difieren ligeramente en mayúsculas o acentos.

    Si una dirección del archivo BDT.csv no coincide con ninguna dirección en BDS.csv, se mostrará en la consola. Esto te ayudará a identificar las diferencias posibles.

    Modifico el código y te lo envío. Vamos a lograrlo, no te desanimes, es solo una cuestión de formato.


    0
    1. Bruno83200_6929 Mensajes publicados 725 Fecha de registro   Estado Miembro Última intervención   170
       

      Aquí, prueba éste ahora.

      import csv import unicodedata # Función para normalizar las direcciones (poner en minúsculas, eliminar acentos) def normalize_string(s): s = s.strip().lower() # Quitar los espacios y pasar a minúsculas s = unicodedata.normalize('NFKD', s).encode('ASCII', 'ignore').decode('ASCII') # Eliminar acentos return s adresse_siren = {} # Leer el archivo BDS.csv y crear un diccionario para las direcciones y SIREN with open('BDS.csv', 'r', encoding='utf-8') as recherche_file: reader = csv.reader(recherche_file) next(reader) # Saltar la fila de cabecera si existe for row in reader: if len(row) < 2: # Verificar que la fila contenga al menos 2 columnas (dirección, siren) print(f"Línea ignorada (columna faltante o mal formateada) : {row}") continue # Saltar las filas incorrectas adresse = normalize_string(row[0]) # Normalizar la dirección siren = row[1].strip() # Quitar espacios superfluos para el siren adresse_siren[adresse] = siren # Leer el archivo BDT.csv y comparar las direcciones con las del diccionario 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']) # Escribir el encabezado en el archivo de salida for row in reader: if len(row) == 0: # Verificar si la fila está vacía print(f"Línea vacía ignorada : {row}") continue adresse = normalize_string(row[0]) # Normalizar la dirección en BDT.csv if adresse in adresse_siren: writer.writerow([row[0], adresse_siren[adresse]]) # Usar la dirección original en el archivo de salida else: print(f"Dirección no encontrada : {row[0]}") # Imprimir las direcciones que no coinciden print("La comparación ha terminado. Los resultados se han escrito en 'update.csv'.") 
      0
      1. Lisana_69 Mensajes publicados 20 Estado Miembro > Bruno83200_6929 Mensajes publicados 725 Fecha de registro   Estado Miembro Última intervención  
         

        Voy a intentar hacer que funcione eso al menos, gracias por vuestra ayuda

        0
  8. Lisana_69 Mensajes publicados 20 Estado Miembro
     

    El archivo update sigue vacío incluso después de modificar el programa.

    No entiendo por qué, porque he verificado que las direcciones del archivo BDS coinciden con las de BDT.

    0
    1. Bruno83200_6929 Mensajes publicados 725 Fecha de registro   Estado Miembro Última intervención   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 Mensajes publicados 20 Estado Miembro > Bruno83200_6929 Mensajes publicados 725 Fecha de registro   Estado Miembro Última intervención  
         

        Después de todas las modificaciones, el problema sigue siendo el mismo y la consola me muestra este mensaje:

        Dirección original ( código ASCII): [32, 59, 59, 59, 59]

        0
  9. Lisana_69 Mensajes publicados 20 Estado Miembro
     

    Okay, lo entiendo

    No hay problema, hasta luego y muchas gracias.

    0
  10. mamiemando Mensajes publicados 33173 Fecha de registro   Estado Moderador Última intervención   7 945
     

    Hola,

    Para que cualquiera pueda probar los programas propuestos, ¿sería posible compartir los archivos CSV en cuestión?

    ¿Has considerado pandas ? Además de que es posible cargar fácilmente archivos csv (ver pd.read_csv), pandas proporciona numerosas primitivas muy eficientes para manipular los datos. Si he entendido bien, el objetivo aquí es encontrar una unión entre los dos archivos según la columna siren (si es así, puedes usar pd.join). Para exportar un dataframe, usa el método to_csv.

    Ejemplo :

    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
  11. Lisana_69 Mensajes publicados 20 Estado Miembro
     

    Gracias por su respuesta, pero lamentablemente no puedo compartir los archivos ya que son contactos de empresa.

    Pero voy a intentar pensar con la función pandas.

    Muchas gracias.

    0
  12. Bruno83200_6929 Mensajes publicados 725 Fecha de registro   Estado Miembro Última intervención   170
     

    Los puntos y comas podrían estar presentes en lugar de separadores válidos, lo que significa que los archivos CSV no están correctamente estructurados o se leen mal.

    Aquí el código modificado para usar el punto y coma como separador, por si acaso así fuera en sus archivos:

    import csv import unicodedata # Función para normalizar direcciones (poner en minúsculas, eliminar acentos) def normalize_string(s): s = s.strip().lower() # Quitar espacios y convertir a minúsculas s = unicodedata.normalize('NFKD', s).encode('ASCII', 'ignore').decode('ASCII') # Eliminar acentos return s adresse_siren = {} # Leer el archivo BDS.csv con el separador punto y coma con open('BDS.csv', 'r', encoding='utf-8') as recherche_file: reader = csv.reader(recherche_file, delimiter=';') # Especificar el separador next(reader) # Saltar la fila de encabezado si existe for row in reader: if len(row) < 2: # Verificar que la fila contiene al menos 2 columnas (dirección, siren) print(f"Línea ignorada (columna faltante o mal formateada) : {row}") continue # Pasar las filas incorrectas adresse = normalize_string(row[0]) # Normalizar la dirección siren = row[1].strip() # Quitar espacios en blanco para el siren print(f"Agregado al diccionario : {row[0]} -> {siren} (normalizado: {adresse})") adresse_siren[adresse] = siren # Leer el archivo BDT.csv con el separador punto y coma y comparar las direcciones 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=';') # Especificar el separador writer = csv.writer(update_file) writer.writerow(['adresse', 'siren']) # Escribir el encabezado en el archivo de salida for row in reader: if len(row) == 0: # Verificar si la fila está vacía print(f"Línea vacía ignorada : {row}") continue adresse = normalize_string(row[0]) # Normalizar la dirección en BDT.csv print(f"Comparando: {row[0]} (normalizado: {adresse})") if adresse in adresse_siren: print(f"Dirección correspondiente encontrada: {row[0]} -> {adresse_siren[adresse]}") writer.writerow([row[0], adresse_siren[adresse]]) # Usar la dirección original en el archivo de salida else: print(f"Dirección no encontrada: {row[0]} (normalizado: {adresse})") print("La comparación ha terminado. Los resultados se han escrito en 'update.csv'.") 

    Si sus archivos utilizan el punto y coma como separador (lo cual parece ser el caso dado los caracteres ;;;;), esto permite que el programa lea correctamente las columnas de los archivos.

    Si esta solución no funciona, podría ser útil revisar manualmente los archivos CSV para asegurarse de que las columnas están separadas por comas o por puntos y coma.


    Si sus archivos no están bien estructurados, intente reexportarlos con una herramienta como Excel o un editor de texto para asegurarse de que cumplen el formato CSV correcto (con separadores claros).

    La manipulación de archivos CSV siempre es muy delicada; los errores suelen estar relacionados con el formato de los archivos. Es siempre más recomendable usar herramientas como Excel y LibreOffice Calc (que es gratuito y de código abierto) que son hojas de cálculo populares para manipular archivos CSV. Si no lo consigue con Python, le aconsejo usar alguno de estos hojas de cálculo.

    Puede copiar/pegar las direcciones de un archivo en una nueva tabla, y luego usar fórmulas como BUSCARV para asociar los SIREN a las direcciones correspondientes.

    Ejemplo de fórmula BUSCARV :

    =BUSCARV(A2;BDS!A:B;2;FALSO)
     

    No sé ya qué solución darle.


    0
    1. Lisana_69 Mensajes publicados 20 Estado Miembro
       

      El programa ha funcionado, gracias por su ayuda.

      tendré una última petición: me gustaría que el código del cliente también se muestre junto con el SIREN asociado (no sé si queda muy claro).

      0
  13. Lisana_69 Mensajes publicados 20 Estado Miembro
     

    Con el código NIC también

    0
    1. Bruno83200_6929 Mensajes publicados 725 Fecha de registro   Estado Miembro Última intervención   170
       

      Para agregar el código de cliente y el código NIC a sus resultados, puede integrarlos en la estructura del archivo CSV de entrada (BDS.csv o BDT.csv, según la fuente de datos). Así es como puede añadirlos a su archivo de resultados.

      El archivo BDS.csv contiene, además de las direcciones y el SIREN, las columnas código de cliente y código NIC.


      Es necesario extraer estas dos nuevas columnas y agregarlas al archivo update.csv.

      import csv import unicodedata # Función para normalizar las direcciones (poner en minúsculas, eliminar acentos) def normalize_string(s): s = s.strip().lower() # Quitar espacios y pasar a minúsculas s = unicodedata.normalize('NFKD', s).encode('ASCII', 'ignore').decode('ASCII') # Eliminar acentos return s adresse_siren = {} # Leer el archivo BDS.csv con separador punto y coma with open('BDS.csv', 'r', encoding='utf-8') as recherche_file: reader = csv.reader(recherche_file, delimiter=';') # Especificar el separador, modifíquelo si es necesario next(reader) # Saltar la fila de encabezado si existe for row in reader: if len(row) < 4: # Verificar que la fila contenga al menos 4 columnas (dirección, siren, código de cliente, código NIC) print(f"Línea ignorada (columna ausente o mal formateada) : {row}") continue # Pasar las líneas incorrectas adresse = normalize_string(row[0]) # Normalizar la dirección siren = row[1].strip() # SIREN code_client = row[2].strip() # Código de cliente code_nic = row[3].strip() # Código NIC print(f"Añadir al diccionario : {row[0]} -> SIREN: {siren}, Código de Cliente: {code_client}, Código NIC: {code_nic} (normalizado : {adresse})") adresse_siren[adresse] = (siren, code_client, code_nic) # Añadir una tupla con SIREN, código de cliente y código NIC # Leer el archivo BDT.csv y comparar direcciones 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=';') # Especificar el separador writer = csv.writer(update_file) # Escribir el encabezado en el archivo de salida writer.writerow(['adresse', 'siren', 'code_client', 'code_nic']) for row in reader: if len(row) == 0: # Verificar si la línea está vacía print(f"Línea vacía ignorada : {row}") continue adresse = normalize_string(row[0]) # Normalizar la dirección en BDT.csv print(f"Comparación de : {row[0]} (normalizado : {adresse})") if adresse in adresse_siren: siren, code_client, code_nic = adresse_siren[adresse] print(f"Dirección correspondiente encontrada : {row[0]} -> SIREN: {siren}, Código de Cliente: {code_client}, Código NIC: {code_nic}") writer.writerow([row[0], siren, code_client, code_nic]) # Usar la dirección original y añadir las demás columnas else: print(f"Dirección no encontrada : {row[0]} (normalizado : {adresse})") print("La comparación ha terminado. Los resultados se han escrito en 'update.csv'.") 

      El archivo BDS.csv debe estar organizado así :

      adresse;siren;code_client;code_nic Dirección 1;123456789;CL12345;NIC001 Dirección 2;987654321;CL54321;NIC002 

      Y el archivo BDT.csv debería tener al menos la columna dirección :

      adresse Dirección 1 Dirección 2 

      El archivo update.csv contendrá las direcciones correspondientes, con el SIREN, el código de cliente y el código NIC asociados :

      adresse,siren,code_client,code_nic Dirección 1,123456789,CL12345,NIC001 Dirección 2,987654321,CL54321,NIC002 

      Este código le permite ahora comparar las direcciones mientras extrae la información asociada como el SIREN, el código de cliente y el código NIC en el archivo de salida.

      0
      1. Lisana_69 Mensajes publicados 20 Estado Miembro > Bruno83200_6929 Mensajes publicados 725 Fecha de registro   Estado Miembro Última intervención  
         

        Entonces en el archivo BDT hay la dirección y el código de cliente y en el BDS hay la dirección, el SIREN y el NIC

        0
      2. Bruno83200_6929 Mensajes publicados 725 Fecha de registro   Estado Miembro Última intervención   170 > Lisana_69 Mensajes publicados 20 Estado Miembro
         

        Gracias por la precisión, entonces aquí, en función de estos elementos:

        import csv import unicodedata # Función para normalizar las direcciones (poner en minúsculas, eliminar acentos) def normalize_string(s): s = s.strip().lower() # Quitar espacios y pasar a minúsculas s = unicodedata.normalize('NFKD', s).encode('ASCII', 'ignore').decode('ASCII') # Eliminar acentos return s adresse_siren_nic = {} # Leer el archivo BDS.csv (con dirección, siren, nic) with open('BDS.csv', 'r', encoding='utf-8') as recherche_file: reader = csv.reader(recherche_file, delimiter=';') # Especificar el separador, modifícalo si es necesario next(reader) # Pasar la fila de encabezado si existe for row in reader: if len(row) < 3: # Verificar que la fila contiene al menos 3 columnas (dirección, siren, nic) print(f"Ligne ignorée (colonne manquante ou mal formatée) : {row}") continue # Pasar las filas incorrectas adresse = normalize_string(row[0]) # Normalizar la dirección siren = row[1].strip() # SIREN nic = row[2].strip() # Código NIC print(f"Ajout au dictionnaire : {row[0]} -> SIREN: {siren}, NIC: {nic} (normalisé : {adresse})") adresse_siren_nic[adresse] = (siren, nic) # Almacenar SIREN y NIC en el diccionario # Leer el archivo BDT.csv (con dirección, código de cliente) y comparar las direcciones 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=';') # Especificar el separador writer = csv.writer(update_file) # Escribir el encabezado en el archivo de salida writer.writerow(['adresse', 'code_client', 'siren', 'nic']) for row in reader: if len(row) < 2: # Verificar que la fila contiene al menos 2 columnas (dirección, código de cliente) print(f"Ligne ignorée (colonne manquante ou mal formatée) : {row}") continue adresse = normalize_string(row[0]) # Normalizar la dirección en BDT.csv code_client = row[1].strip() # Código de cliente print(f"Comparaison de : {row[0]} (normalisé : {adresse}) avec le code client : {code_client}") if adresse in adresse_siren_nic: # Si la dirección corresponde 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 Mensajes publicados 20 Estado Miembro > Bruno83200_6929 Mensajes publicados 725 Fecha de registro   Estado Miembro Última intervención  
         

        Gracias por el tiempo que ha dedicado para ayudarme con la creación de este programa.

        Todo funciona, solo me queda limpiar las bases de datos para encontrar más SIREN.

        Que tenga un buen día.

        y tal vez tengamos la oportunidad de volver a conversar sobre otros programas en Python.

        0
      4. Bruno83200_6929 Mensajes publicados 725 Fecha de registro   Estado Miembro Última intervención   170 > Lisana_69 Mensajes publicados 20 Estado Miembro
         

        ¡Fue un gran placer!!!

        1