Filtrado de caracteres especiales al importar desde excel. Cambios en la logica de importacion inicial.

This commit is contained in:
Miguel 2024-10-08 16:58:04 +02:00
parent f78400399e
commit b38453248b
17 changed files with 11435 additions and 20097 deletions

View File

@ -6,95 +6,30 @@ idioma_var2 = English_US
[TextContent]
output_text = Ejecutando x1_importar_to_master.run()
Se han agregado 929 nuevas filas al archivo maestro.
Se han agregado 939 nuevas filas válidas al archivo maestro.
Ejecutando x2_master_export2translate.run()
Archivo guardado exitosamente.
Archivo leído y limpiado exitosamente: .\data\1_hmi_master_translates_allenbradley.xlsx
Archivo exportado para traducción: .\data\2_master_export2translate_allenbradley.xlsx
Ejecutando x3_llm_auto_translate.run()
Número total de textos a traducir: 621
Traduciendo : celdas desde: 0 a :20.
Traduciendo : celdas desde: 20 a :40.
Traduciendo : celdas desde: 40 a :60.
Traduciendo : celdas desde: 60 a :80.
Traduciendo : celdas desde: 80 a :100.
Traduciendo : celdas desde: 100 a :120.
Traduciendo : celdas desde: 120 a :140.
Traduciendo : celdas desde: 140 a :160.
Traduciendo : celdas desde: 160 a :180.
Traduciendo : celdas desde: 180 a :200.
Traduciendo : celdas desde: 200 a :220.
Traduciendo : celdas desde: 220 a :240.
Traduciendo : celdas desde: 240 a :260.
Error en el intento 1 de traducción de celdas desde 240 a 260: La cantidad de traducciones recibidas no coincide con la cantidad de textos enviados.. Reintentando...
Traduciendo : celdas desde: 260 a :280.
Traduciendo : celdas desde: 280 a :300.
Traduciendo : celdas desde: 300 a :320.
Traduciendo : celdas desde: 320 a :340.
Traduciendo : celdas desde: 340 a :360.
Traduciendo : celdas desde: 360 a :380.
Traduciendo : celdas desde: 380 a :400.
Traduciendo : celdas desde: 400 a :420.
Traduciendo : celdas desde: 420 a :440.
Traduciendo : celdas desde: 440 a :460.
Traduciendo : celdas desde: 460 a :480.
Traduciendo : celdas desde: 480 a :500.
Traduciendo : celdas desde: 500 a :520.
Traduciendo : celdas desde: 520 a :540.
Traduciendo : celdas desde: 540 a :560.
Traduciendo : celdas desde: 560 a :580.
Traduciendo : celdas desde: 580 a :600.
Traduciendo : celdas desde: 600 a :620.
Traduciendo : celdas desde: 620 a :621.
Afinidad: celdas desde: 0 a :20.
Error en el intento 1 de Afinidad de celdas desde 0 a 20: La cantidad de afinidades recibidas no coincide con la cantidad de textos enviados.. Reintentando...
Error en todos los intentos de Afinidad de celdas desde 0 a 20: La cantidad de afinidades recibidas no coincide con la cantidad de textos enviados.
Afinidad: celdas desde: 20 a :40.
Afinidad: celdas desde: 40 a :60.
Afinidad: celdas desde: 60 a :80.
Afinidad: celdas desde: 80 a :100.
Error en el intento 1 de Afinidad de celdas desde 80 a 100: La cantidad de afinidades recibidas no coincide con la cantidad de textos enviados.. Reintentando...
Error en todos los intentos de Afinidad de celdas desde 80 a 100: La cantidad de afinidades recibidas no coincide con la cantidad de textos enviados.
Afinidad: celdas desde: 100 a :120.
Afinidad: celdas desde: 120 a :140.
Error en el intento 1 de Afinidad de celdas desde 120 a 140: La cantidad de afinidades recibidas no coincide con la cantidad de textos enviados.. Reintentando...
Error en todos los intentos de Afinidad de celdas desde 120 a 140: La cantidad de afinidades recibidas no coincide con la cantidad de textos enviados.
Afinidad: celdas desde: 140 a :160.
Afinidad: celdas desde: 160 a :180.
Afinidad: celdas desde: 180 a :200.
Afinidad: celdas desde: 200 a :220.
Afinidad: celdas desde: 220 a :240.
Afinidad: celdas desde: 240 a :260.
Afinidad: celdas desde: 260 a :280.
Afinidad: celdas desde: 280 a :300.
Afinidad: celdas desde: 300 a :320.
Afinidad: celdas desde: 320 a :340.
Afinidad: celdas desde: 340 a :360.
Afinidad: celdas desde: 360 a :380.
Error en el intento 1 de Afinidad de celdas desde 360 a 380: La cantidad de afinidades recibidas no coincide con la cantidad de textos enviados.. Reintentando...
Error en todos los intentos de Afinidad de celdas desde 360 a 380: La cantidad de afinidades recibidas no coincide con la cantidad de textos enviados.
Afinidad: celdas desde: 380 a :400.
Afinidad: celdas desde: 400 a :420.
Afinidad: celdas desde: 420 a :440.
Afinidad: celdas desde: 440 a :460.
Afinidad: celdas desde: 460 a :480.
Afinidad: celdas desde: 480 a :500.
Afinidad: celdas desde: 500 a :520.
Afinidad: celdas desde: 520 a :540.
Afinidad: celdas desde: 540 a :560.
Afinidad: celdas desde: 560 a :580.
Afinidad: celdas desde: 580 a :600.
Afinidad: celdas desde: 600 a :620.
Afinidad: celdas desde: 620 a :621.
Archivo leído y limpiado exitosamente: .\data\2_master_export2translate_allenbradley.xlsx
Número total de textos a traducir: 0
Archivo guardado exitosamente.
Archivo traducido guardado en: .\data\3_master_export2translate_translated_allenbradley.xlsx
Ejecutando x4_integrate_translates_to_master.run()
Archivo leído y limpiado exitosamente: .\data\1_hmi_master_translates_allenbradley.xlsx
Archivo leído y limpiado exitosamente: .\data\3_master_export2translate_translated_allenbradley.xlsx
Archivo guardado exitosamente.
Traducciones importadas y archivo maestro actualizado: .\data\1_hmi_master_translates_allenbradley.xlsx.
Ejecutando x5_complete_empty_cells_master.run()
Ejecutando x4_integrate_translates_to_master.run()
Archivo leído y limpiado exitosamente: .\data\1_hmi_master_translates_allenbradley.xlsx
Archivo leído y limpiado exitosamente: .\data\3_master_export2translate_translated_allenbradley.xlsx
Archivo guardado exitosamente.
Traducciones importadas y archivo maestro actualizado: .\data\1_hmi_master_translates_allenbradley.xlsx.
Ejecutando x6_update_from_master.run()
Archivo leído y limpiado exitosamente: .\data\1_hmi_master_translates_allenbradley.xlsx
Archivo leído y limpiado exitosamente: C:/Trabajo/VM/31 - 9.3953 - Omega - Mexico - (ABradley)/Reporte/Languages/HMI_93953_30.xlsx
Archivo guardado exitosamente.
Se han actualizado las filas en C:/Trabajo/VM/31 - 9.3953 - Omega - Mexico - (ABradley)/Reporte/HMI/HMI_93953_25.xlsx desde el archivo maestro.
Se han actualizado las filas en C:/Trabajo/VM/31 - 9.3953 - Omega - Mexico - (ABradley)/Reporte/Languages/HMI_93953_30.xlsx desde el archivo maestro.

File diff suppressed because it is too large Load Diff

View File

@ -1,97 +1,96 @@
import pandas as pd
import os
import re
import logging
import PyLibrary.funciones_comunes as fc
def preprocesar_importacion(tipo_PLC, codigo_columna_maestra, df_importacion):
# Iterar sobre las filas del DataFrame de importación
def preprocesar_importacion(tipo_PLC, codigo_columna_maestra, df_importacion, logger):
filas_validas = []
for index, fila in df_importacion.iterrows():
clave_original = str(fila[codigo_columna_maestra])
clave_sustituida = fc.compactar_celda_clave(tipo_PLC, clave_original)
# Sustituir en las demás columnas del tipo "xx-YY"
clave_original = fila[codigo_columna_maestra]
# Verificar si la celda de la columna maestra está vacía o solo contiene espacios en blanco
if pd.isna(clave_original) or str(clave_original).strip() == '':
logger.info(f"Fila {index}: Ignorada - Celda de columna maestra vacía o solo con espacios en blanco")
continue
# Aplicar unescape solo a las filas con valor no vacío en la columna maestra
nueva_fila = fila.copy()
for col in nueva_fila.index:
nueva_fila[col] = fc.limpiar_caracteres_especiales(str(nueva_fila[col]))
clave_sustituida = fc.compactar_celda_clave(tipo_PLC, str(nueva_fila[codigo_columna_maestra]))
nueva_fila[codigo_columna_maestra] = clave_sustituida
for columna in df_importacion.columns:
if columna != codigo_columna_maestra and fc.es_columna_tipo_xxYY(columna):
df_importacion.at[index, columna] = (
fc.compactar_celda_traducida(tipo_PLC, fila[columna])
)
# Guardar la clave sustituida
df_importacion.at[index, codigo_columna_maestra] = clave_sustituida
return df_importacion
nueva_fila[columna] = fc.compactar_celda_traducida(tipo_PLC, nueva_fila[columna])
filas_validas.append(nueva_fila)
logger.info(f"Fila {index}: Aceptada - Clave '{clave_sustituida}' procesada")
df_valido = pd.DataFrame(filas_validas, columns=df_importacion.columns)
return df_valido
def importar(tipo_PLC, codigo_columna_maestra, archivo_maestro, archivo_importacion):
logger = fc.configurar_logger()
logger.info(" .... ")
logger.info(f"Iniciando importacion en {archivo_maestro} desde el archivo {archivo_importacion}")
if not os.path.exists(archivo_maestro):
# Crear un DataFrame maestro vacío con la columna codigo_columna_maestra
df_maestro = pd.DataFrame(columns=[codigo_columna_maestra])
else:
df_maestro = pd.read_excel(archivo_maestro)
df_maestro = fc.read_dataframe_with_cleanup_retries(archivo_maestro)
# Aplicar unescape solo a las filas con valor no vacío en la columna maestra
df_importacion = pd.read_excel(archivo_importacion)
# Preprocesar el archivo de importación
df_importacion = preprocesar_importacion(tipo_PLC, codigo_columna_maestra, df_importacion)
df_importacion = preprocesar_importacion(tipo_PLC, codigo_columna_maestra, df_importacion, logger)
# Obtener las claves existentes en el archivo maestro
claves_maestro = set(df_maestro[codigo_columna_maestra].dropna().astype(str))
# Filtrar filas del archivo de importación que no están en el archivo maestro
nuevas_filas = df_importacion[
df_importacion[codigo_columna_maestra].apply(
lambda x: len(str(x)) > 5 and str(x) not in claves_maestro
)
]
# Si no hay filas nuevas, terminar
if nuevas_filas.empty:
print("No hay nuevas filas para agregar.")
return
# Agregar columnas del tipo "xx-YY" que no existen en el archivo maestro
for columna in nuevas_filas.columns:
if (
fc.es_columna_tipo_xxYY(columna)
and columna not in df_maestro.columns
):
df_maestro[columna] = None
# Crear una lista de diccionarios para las filas que se van a agregar
filas_a_agregar = []
# Iterar sobre las nuevas filas para agregarlas y actualizar las claves
for _, fila in nuevas_filas.iterrows():
for index, fila in df_importacion.iterrows():
clave = str(fila[codigo_columna_maestra])
if clave not in claves_maestro:
claves_maestro.add(clave)
# Solo agregar las columnas del tipo "xx-YY" y codigo_columna_maestra
fila_filtrada = {
col: fila[col]
for col in fila.index
if col == codigo_columna_maestra or fc.es_columna_tipo_xxYY(col)
}
filas_a_agregar.append(fila_filtrada)
if clave in claves_maestro:
logger.info(f"Fila {index}: Ignorada - Clave '{clave}' ya existe en el archivo maestro")
continue
claves_maestro.add(clave)
fila_filtrada = {
col: fila[col]
for col in fila.index
if col == codigo_columna_maestra or fc.es_columna_tipo_xxYY(col)
}
filas_a_agregar.append(fila_filtrada)
# Concatenar las nuevas filas al DataFrame maestro
if filas_a_agregar:
df_nuevas_filas = pd.DataFrame(filas_a_agregar)
df_maestro = pd.concat([df_maestro, df_nuevas_filas], ignore_index=True)
if not filas_a_agregar:
logger.info("No hay nuevas filas válidas para agregar.")
return
for columna in df_importacion.columns:
if fc.es_columna_tipo_xxYY(columna) and columna not in df_maestro.columns:
df_maestro[columna] = None
df_nuevas_filas = pd.DataFrame(filas_a_agregar)
df_maestro = pd.concat([df_maestro, df_nuevas_filas], ignore_index=True)
# Guardar el archivo maestro actualizado
df_maestro.to_excel(archivo_maestro, index=False)
print(f"Se han agregado {len(filas_a_agregar)} nuevas filas al archivo maestro.")
logger.info(f"Se han agregado {len(filas_a_agregar)} nuevas filas válidas al archivo maestro.")
print(f"Se han agregado {len(filas_a_agregar)} nuevas filas válidas al archivo maestro.")
def run(tipo_PLC, codigo_columna_maestra) :
# Cargar el archivo maestro y el archivo de importación
def run(tipo_PLC, codigo_columna_maestra):
archivo_maestro = f".\\data\\1_hmi_master_translates_{tipo_PLC}.xlsx"
archivo_importacion = fc.select_file("xlsx")
if archivo_importacion:
importar(tipo_PLC, codigo_columna_maestra, archivo_maestro, archivo_importacion)
if __name__ == "__main__":
tipo_PLC = "siemens"
codigo_columna_maestra = "it-IT"
run(tipo_PLC, codigo_columna_maestra)
run(tipo_PLC, codigo_columna_maestra)

View File

@ -2,23 +2,36 @@ import pandas as pd
import os
import PyLibrary.funciones_comunes as fc
def exportar_para_traduccion(tipo_PLC, archivo_maestro, target_lang_code):
if not os.path.exists(archivo_maestro):
print("El archivo maestro no existe.")
return
df_maestro = pd.read_excel(archivo_maestro)
# Leer el archivo maestro
df_maestro = fc.read_dataframe_with_cleanup_retries(archivo_maestro)
# Crear un nuevo DataFrame para la exportación
df_export = pd.DataFrame()
# Copiar la primera columna tal cual
df_export[df_maestro.columns[0]] = df_maestro[df_maestro.columns[0]]
# Copiar la primera columna y la columna del idioma de destino
primera_columna = df_maestro.columns[0]
df_export[primera_columna] = df_maestro[primera_columna]
df_export[target_lang_code] = df_maestro[target_lang_code]
# Guardar el archivo exportado
ruta_export = os.path.join(os.path.dirname(archivo_maestro), f'2_master_export2translate_{tipo_PLC}.xlsx')
fc.save_dataframe_with_retries(df_export,output_path=ruta_export)
# Usar ExcelWriter para tener más control sobre el proceso de escritura
with pd.ExcelWriter(ruta_export, engine='openpyxl') as writer:
df_export.to_excel(writer, index=False, sheet_name='Sheet1')
# Ajustar el ancho de las columnas
worksheet = writer.sheets['Sheet1']
for idx, col in enumerate(df_export.columns):
max_length = max(df_export[col].astype(str).map(len).max(), len(col))
if max_length > 50 : max_length = 50
worksheet.column_dimensions[chr(65 + idx)].width = max_length + 2
print(f"Archivo exportado para traducción: {ruta_export}")
@ -35,4 +48,4 @@ if __name__ == "__main__":
codigo_columna_maestra = "it-IT"
fc.mostrar_idiomas()
seleccion_idioma = int(input("Introduce el número del idioma de destino: "))
run(tipo_PLC, seleccion_idioma)
run(tipo_PLC, codigo_columna_maestra, seleccion_idioma)

View File

@ -13,7 +13,6 @@ from tqdm import tqdm
import PyLibrary.funciones_comunes as fc
import time
openai_client = OpenAI(api_key=openai_api_key())
GOOGLE_APPLICATION_CREDENTIALS = "translate-431108-020c17463fbb.json"
logger = fc.configurar_logger()
@ -192,8 +191,10 @@ def calcular_afinidad(tipo_PLC, texto1, texto2):
return score
def main(tipo_PLC, codigo_columna_maestra, file_path, target_lang_code, target_lang, traducir_todo, batch_size=10):
df = pd.read_excel(file_path)
df = fc.read_dataframe_with_cleanup_retries(file_path)
source_col = codigo_columna_maestra
source_translated_col = target_lang_code
target_col = f"{target_lang_code} Translated"

View File

@ -22,8 +22,8 @@ def importar_traduccion(tipo_PLC, archivo_maestro, archivo_traduccion, target_la
translated_col = f"{target_lang_code} Translated"
affinity_col = f"{target_lang_code} Affinity"
df_maestro = pd.read_excel(archivo_maestro)
df_traduccion = pd.read_excel(archivo_traduccion)
df_maestro = fc.read_dataframe_with_cleanup_retries(archivo_maestro)
df_traduccion = fc.read_dataframe_with_cleanup_retries(archivo_traduccion)
# Configurar el logger
logger = fc.configurar_logger()

View File

@ -3,37 +3,38 @@ import pandas as pd
import os
import re
import logging
from openpyxl.utils.escape import unescape
def complete_emptys(tipo_PLC, archivo_maestro, target_lang_code, second_lang_code):
def complete_emptys(tipo_PLC,codigo_columna_maestra, archivo_maestro, target_lang_code, second_lang_code):
if not os.path.exists(archivo_maestro):
print("El archivo maestro no existe.")
return
master_col = target_lang_code
target_col = target_lang_code
second_col = second_lang_code
df_maestro = pd.read_excel(archivo_maestro)
df_maestro = fc.read_dataframe_with_cleanup_retries(archivo_maestro)
# Configurar el logger
logger = fc.configurar_logger()
# Iterar sobre las filas del archivo de traducción para actualizar el maestro
for index, fila in df_maestro.iterrows():
clave = fila[df_maestro.columns[0]]
if fila[master_col] == "" or pd.isnull(fila[master_col]):
clave = fila[codigo_columna_maestra]
if fila[target_col] == "" or pd.isnull(fila[target_col]):
if pd.notnull(fila[second_col]) and fila[second_col] != "":
df_maestro.loc[
df_maestro[df_maestro.columns[0]] == clave, master_col
df_maestro[codigo_columna_maestra] == clave, target_col
] = fila[second_col]
logger.info(
f'Fila {index}, Columna {master_col}: " actualizado a "{fila[second_col]}"'
f'Fila {index}, Columna {target_col}: " actualizado a "{fila[second_col]}"'
)
else:
df_maestro.loc[
df_maestro[df_maestro.columns[0]] == clave, master_col
] = fc.compactar_celda_traducida(tipo_PLC, fila[df_maestro.columns[0]])
df_maestro[codigo_columna_maestra] == clave, target_col
] = fc.compactar_celda_traducida(tipo_PLC, fila[codigo_columna_maestra])
logger.info(
f'Fila {index}, Columna {master_col}: " actualizado a "{fila[df_maestro.columns[0]]}"'
f'Fila {index}, Columna {target_col}: " actualizado a "{fila[codigo_columna_maestra]}"'
)
# Guardar el archivo maestro actualizado
@ -57,7 +58,7 @@ def run(tipo_PLC, codigo_columna_maestra, seleccion_idioma, seleccion_idioma_sec
_, target_lang_code = fc.IDIOMAS[seleccion_idioma]
_, second_lang_code = fc.IDIOMAS[seleccion_idioma_secundario]
complete_emptys(tipo_PLC, archivo_maestro, target_lang_code, second_lang_code)
complete_emptys(tipo_PLC, codigo_columna_maestra, archivo_maestro, target_lang_code, second_lang_code)
if __name__ == "__main__":
tipo_PLC = "siemens"

View File

@ -3,9 +3,9 @@ import os
import re
import logging
import PyLibrary.funciones_comunes as fc
from openpyxl.utils.escape import unescape
def update_from_master(tipo_PLC, archivo_maestro, archivo_to_update, target_lang_code):
def update_from_master(tipo_PLC, codigo_columna_maestra, archivo_maestro, archivo_to_update, target_lang_code):
if not os.path.exists(archivo_maestro):
print("El archivo maestro no existe.")
return
@ -18,17 +18,22 @@ def update_from_master(tipo_PLC, archivo_maestro, archivo_to_update, target_lang
f"Iniciando actualizacion en {archivo_to_update} desde el archivo maestro. Para {target_lang_code} "
)
df_maestro = pd.read_excel(archivo_maestro)
df_to_update = pd.read_excel(archivo_to_update)
df_maestro = fc.read_dataframe_with_cleanup_retries(archivo_maestro)
df_to_update = fc.read_dataframe_with_cleanup_retries(archivo_to_update)
col_clave = df_maestro.columns[0]
col_clave = codigo_columna_maestra
# Iterar sobre las filas del archivo de actualización para actualizarlas
for index, fila in df_to_update.iterrows():
clave = fila[col_clave]
for index, fila in df_to_update.iterrows():
valor_original = fila[col_clave]
clave = fc.compactar_celda_clave(tipo_PLC, valor_original)
logger.info(
f'Fila {index} : Clave: {clave}'
)
if not pd.isnull(clave) and clave in df_maestro[col_clave].values:
# Obtenemos los valores
valor_original = fila[col_clave]
valor_traducido_compacto = df_maestro.loc[
df_maestro[col_clave] == clave, target_lang_code
].values[0]
@ -36,23 +41,21 @@ def update_from_master(tipo_PLC, archivo_maestro, archivo_to_update, target_lang
valor_traducido = fc.decompactar_celda_traducida(tipo_PLC,
celda_original=valor_original, celda_traducida=valor_traducido_compacto
)
if (
not pd.isnull(valor_traducido)
and fila[target_lang_code] != valor_traducido
):
# Salvamos en el file to Update
okToSave, Error = fc.verificar_celda_traducida(tipo_PLC,
valor_original, valor_traducido_compacto
clave, valor_traducido_compacto
)
if okToSave:
logger.info(
f'Fila {index} : Clave: {clave}, Columna {target_lang_code}: "{valor_original}" actualizado a "{valor_traducido}"'
)
logger.info("Actualizado.")
df_to_update.at[index, target_lang_code] = valor_traducido
else:
df_to_update.at[index, target_lang_code] = valor_original
logger.error(
f'Fila {index}, Columna {target_lang_code}: "{df_to_update.at[index, target_lang_code]}" valor:"{valor_traducido}" no actualizado porque {Error}'
f'No actualizado porque: {Error}'
)
# Guardar el archivo actualizado
@ -75,7 +78,7 @@ def run(tipo_PLC, codigo_columna_maestra, seleccion_idioma) :
print("Selección inválida.")
else:
_, target_lang_code = fc.IDIOMAS[seleccion_idioma]
update_from_master(tipo_PLC, archivo_maestro, archivo_to_update, target_lang_code)
update_from_master(tipo_PLC, codigo_columna_maestra, archivo_maestro, archivo_to_update, target_lang_code)
if __name__ == "__main__":
tipo_PLC = "siemens"