# products_comands.py # Uso: # python .\products_comands.py .\Productos.csv .\comandos.txt import csv, sys, os TABLA = 'productos' COLUMNAS = ['id_producto', 'nombre_comercial', 'categoria_general'] BLOQUE = 5000000 USAR_NULL = False # True => '' -> NULL INSERT_POR_FILA = False # True => un INSERT por cada fila def esc(s: str) -> str: if s is None: return "NULL" if USAR_NULL else "''" s = str(s).strip().replace("'", "''") if s == '': return "NULL" if USAR_NULL else "''" return f"'{s}'" def es_encabezado(fila): if not fila: return False lowers = [c.lower().strip() for c in fila] claves = ['id_producto', 'nombre_comercial', 'categoria_general', 'id', 'nombre', 'categoria'] return sum(any(k in c for k in claves) for c in lowers) >= 2 def leer_csv(ruta): posibles = ['utf-8-sig', 'utf-8', 'cp1252', 'latin-1'] ultimo_error = None for enc in posibles: try: with open(ruta, 'r', encoding=enc, newline='') as f: muestra = f.read(4096); f.seek(0) try: dialect = csv.Sniffer().sniff(muestra, delimiters=",;\t|") except Exception: dialect = csv.excel_tab if '\t' in muestra else csv.excel return list(csv.reader(f, dialect)) except UnicodeDecodeError as e: ultimo_error = e continue try: import chardet with open(ruta, 'rb') as fb: raw = fb.read() enc = (chardet.detect(raw).get('encoding') or 'latin-1') with open(ruta, 'r', encoding=enc, errors='replace', newline='') as f: muestra = f.read(4096); f.seek(0) try: dialect = csv.Sniffer().sniff(muestra, delimiters=",;\t|") except Exception: dialect = csv.excel_tab if '\t' in muestra else csv.excel return list(csv.reader(f, dialect)) except Exception: pass raise ultimo_error or UnicodeDecodeError("decode", b"", 0, 1, "No se pudo decodificar el CSV") def nombre_salida(ruta_in, ruta_out=None): if ruta_out: return ruta_out base, _ = os.path.splitext(ruta_in) return base + '_insert.txt' def main(): if len(sys.argv) < 2: print("Uso: python products_comands.py archivo.csv [salida.txt]", file=sys.stderr) sys.exit(1) ruta_csv = sys.argv[1] ruta_txt = nombre_salida(ruta_csv, sys.argv[2] if len(sys.argv) >= 3 else None) filas = leer_csv(ruta_csv) if filas and es_encabezado(filas[0]): filas = filas[1:] vistos = set() # para detectar id_producto repetidos duplicadas = 0 valores = [] for fila in filas: if not fila: continue idp = (fila[0] if len(fila) > 0 else '').strip() nombre = fila[1] if len(fila) > 1 else '' categoria = fila[2] if len(fila) > 2 else '' if idp == '': duplicadas += 1 continue if idp in vistos: duplicadas += 1 continue vistos.add(idp) valores.append(f"({esc(idp)}, {esc(nombre)}, {esc(categoria)})") cols = ", ".join(COLUMNAS) lineas = [] if INSERT_POR_FILA: for v in valores: lineas.append(f"INSERT INTO {TABLA} ({cols}) VALUES {v};") else: if BLOQUE and BLOQUE > 0: for i in range(0, len(valores), BLOQUE): chunk = valores[i:i+BLOQUE] lineas.append(f"INSERT INTO {TABLA} ({cols}) VALUES") lineas.append(",\n".join(chunk) + ";") else: lineas.append(f"INSERT INTO {TABLA} ({cols}) VALUES") lineas.append(",\n".join(valores) + ";") with open(ruta_txt, 'w', encoding='utf-8') as f: f.write("\n".join(lineas)) print(f"Listo: {ruta_txt} (omitidas por duplicado/ vacĂ­o: {duplicadas})") if __name__ == "__main__": main()