diff --git a/columnas_info.json b/columnas_info.json new file mode 100644 index 0000000..0a6ef1a --- /dev/null +++ b/columnas_info.json @@ -0,0 +1,44 @@ +{ + "estadisticas_establecimientos_juego": [ + "a_o", + "provincia", + "almac_n_fiscal_no_existe_desde_el_a_o_2021_", + "almac_n_m_quinas", + "bingo", + "bar_esp_", + "bolera", + "casinos", + "camping", + "centro_de_ocio", + "caf_teatro", + "discoteca", + "bares", + "cafeter_as", + "pub", + "centro_recreativo_familiar", + "restaurante", + "sal_n_de_juego", + "casas_de_apuestas", + "c_rner_ap_", + "zona_ap_", + "almac_n_apuestas", + "total_a_31_12_", + "prov" + ], + "condenas_sexo_localidad": [ + "lugar_de_nacimiento_sexo_comunidades_y_ciudades_au" + ], + "registro_prohibidos_juego": [ + "a_o", + "altas_otras_causas", + "altas_petici_n_propia", + "bajas_otras_causas", + "bajas_petici_n_propia", + "total_en_activo_a_31_12" + ], + "consumo_drogas_alcohol_esp": [ + "consumo_de_alcohol", + "consumo_de_drogas_y_tipo_de_drogas", + "total" + ] +} \ No newline at end of file diff --git a/compose.yaml b/compose.yaml new file mode 100644 index 0000000..db64ca3 --- /dev/null +++ b/compose.yaml @@ -0,0 +1,19 @@ +services: + mysql: + image: mysql:8.0 + container_name: adicciones_db + restart: always + environment: + MYSQL_ROOT_PASSWORD: root + MYSQL_DATABASE: adicciones + MYSQL_USER: user + MYSQL_PASSWORD: pass + ports: + - "3307:3306" + volumes: + - ./mysql_data:/var/lib/mysql + healthcheck: + test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] + interval: 10s + timeout: 5s + retries: 5 \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..df48843 --- /dev/null +++ b/main.py @@ -0,0 +1,137 @@ +import os +import pandas as pd +import mysql.connector +import json +import csv +import re + + +# ------------------------------------------------------------ +# CONFIGURACIÓN DE LA BASE DE DATOS +# ------------------------------------------------------------ +DB_CONFIG = { + "host": "localhost", + "port": 3307, # Puerto diferente al 3306 para evitar conflictos + "user": "user", # Usuario definido en docker-compose + "password": "pass", # Contraseña definida en docker-compose + "database": "adicciones" +} + +DATASETS_DIR = "datasets" # Carpeta donde están los CSV +OUTPUT_FILE = "columnas_info.json" # Archivo de salida con las columnas detectadas + + +# ------------------------------------------------------------ +# FUNCIONES AUXILIARES +# ------------------------------------------------------------ + +def get_connection(): + # Establece conexión con la base de datos MySQL + return mysql.connector.connect(**DB_CONFIG) + + +def sanitize_name(name: str) -> str: + # Limpia los nombres de columnas y tablas para que sean válidos en SQL + name = name.strip().lower() + name = re.sub(r"[^a-z0-9_]+", "_", name) # Solo permite letras, números y guiones bajos + return name[:50] # Limita a 50 caracteres para cumplir con el límite de MySQL + + +def detect_delimiter(file_path): + # Detecta automáticamente el delimitador más probable del CSV + with open(file_path, 'r', encoding='latin-1', errors='ignore') as f: + sample = f.read(2048) + try: + dialect = csv.Sniffer().sniff(sample, delimiters=";,|\t") + delim = dialect.delimiter + + # Si detecta algo raro (espacios, strings largos, etc.), usamos ';' por defecto + if delim.strip() == "" or len(delim) > 1: + return ";" + return delim + + except csv.Error: + return ";" + + +def load_csv(path, delimiter): + # Intenta leer el CSV usando varias codificaciones comunes en archivos en español + encodings = ["utf-8", "latin-1", "cp1252"] + last_error = None + + for enc in encodings: + try: + return pd.read_csv(path, delimiter=delimiter, encoding=enc) + except Exception as e: + last_error = e + + # Si todas las lecturas fallan, lanza el último error + raise last_error + + +# ------------------------------------------------------------ +# PROCESO PRINCIPAL +# ------------------------------------------------------------ + +def main(): + conn = get_connection() + cursor = conn.cursor() + columnas_info = {} + + # Recorre todos los archivos CSV en la carpeta datasets/ + for filename in os.listdir(DATASETS_DIR): + if not filename.endswith(".csv"): + continue + + path = os.path.join(DATASETS_DIR, filename) + table_name = sanitize_name(os.path.splitext(filename)[0]) + + print(f"\n📊 Procesando: {filename} → tabla '{table_name}'") + + # Detecta el delimitador del archivo + delimiter = detect_delimiter(path) + print(f" → delimitador detectado: '{delimiter}'") + + # Carga el CSV probando codificaciones (UTF-8, Latin-1, CP1252) + try: + df = load_csv(path, delimiter) + except Exception as e: + print(f"❌ Error leyendo {filename}: {e}") + continue + + # Limpia y normaliza los nombres de columnas + df.columns = [sanitize_name(c) for c in df.columns] + columnas_info[table_name] = list(df.columns) + + # Crea la tabla en MySQL si no existe + columns_sql = ", ".join([f"`{c}` TEXT" for c in df.columns]) + create_sql = f"CREATE TABLE IF NOT EXISTS `{table_name}` ({columns_sql});" + cursor.execute(create_sql) + + # Inserta cada fila en la tabla + for _, row in df.iterrows(): + placeholders = ", ".join(["%s"] * len(df.columns)) + insert_sql = f"INSERT INTO `{table_name}` VALUES ({placeholders});" + try: + cursor.execute(insert_sql, tuple(row.astype(str).fillna("").values)) + except Exception as e: + print(f"⚠️ Error insertando fila en {table_name}: {e}") + + # Confirma los cambios en la base de datos + conn.commit() + + # Cierra la conexión y guarda la información de columnas + cursor.close() + conn.close() + + with open(OUTPUT_FILE, "w", encoding="utf-8") as f: + json.dump(columnas_info, f, indent=4, ensure_ascii=False) + + print(f"\n✅ Proceso completado. Columnas guardadas en '{OUTPUT_FILE}'") + + +# ------------------------------------------------------------ +# EJECUCIÓN +# ------------------------------------------------------------ +if __name__ == "__main__": + main() diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..d2db399 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +pandas +mysql-connector-python \ No newline at end of file