Files
scripts/file-management/teams.py
Guillem Hernandez Sola da6dabcc62 Added all
2026-04-07 19:37:59 +02:00

104 lines
3.5 KiB
Python

import pandas as pd
import glob
import re
import os
import csv
def extreure_minuts(temps_str):
"""Converteix cadenes de text com '2h 15m', '45m' o '1h' a minuts totals."""
if pd.isna(temps_str):
return 0
temps_str = str(temps_str).lower()
hores = 0
minuts = 0
match_h = re.search(r'(\d+)\s*h', temps_str)
if match_h:
hores = int(match_h.group(1))
match_m = re.search(r'(\d+)\s*m', temps_str)
if match_m:
minuts = int(match_m.group(1))
return (hores * 60) + minuts
fitxers = glob.glob("*.csv")
dades_alumnes = {}
if not fitxers:
print("⚠️ No s'han trobat fitxers CSV a la carpeta actual.")
else:
print(f"S'han trobat {len(fitxers)} fitxers. Processant dades...\n")
for fitxer in fitxers:
try:
# 1. Obrim el fitxer manualment per buscar a quina fila comencen les dades
with open(fitxer, 'r', encoding='utf-16') as f:
linies = f.readlines()
fila_capcalera = -1
separador = '\t'
# Busquem la línia que conté "Nom" o "Nombre" o "Name"
for i, linia in enumerate(linies):
if 'Nom' in linia or 'Nombre' in linia or 'Name' in linia:
fila_capcalera = i
# Detectem si fa servir tabulacions o comes
if ',' in linia and '\t' not in linia:
separador = ','
break
if fila_capcalera == -1:
print(f"⚠️ Saltant '{fitxer}': No s'ha trobat cap fila amb la paraula 'Nom'.")
continue
# 2. Llegim el CSV dient-li exactament on comença
df = pd.read_csv(fitxer, sep=separador, encoding='utf-16', skiprows=fila_capcalera)
# 3. Busquem les columnes dinàmicament
col_durada = next((col for col in df.columns if 'durada' in col.lower() or 'duración' in col.lower() or 'duration' in col.lower()), None)
col_nom = next((col for col in df.columns if 'nom' in col.lower() or 'nombre' in col.lower() or 'name' in col.lower()), None)
if not col_nom or not col_durada:
print(f"⚠️ Saltant '{fitxer}': Columnes invàlides. Trobades: {list(df.columns)}")
continue
for index, row in df.iterrows():
nom = row[col_nom]
if pd.isna(nom):
continue
minuts = extreure_minuts(row[col_durada])
# Apliquem la regla del 5 de febrer (límit de 205 minuts)
if "2-05-26" in fitxer and minuts > 205:
minuts = 205
if nom in dades_alumnes:
dades_alumnes[nom] += minuts
else:
dades_alumnes[nom] = minuts
except UnicodeError:
print(f"❌ Error de codificació al fitxer '{fitxer}'. Intenta obrir-lo i guardar-lo de nou.")
except Exception as e:
print(f"❌ Error processant el fitxer '{fitxer}': {e}")
# 4. Resultats
if dades_alumnes:
print("="*50)
print("📊 RESULTATS D'ASSISTÈNCIA (Mínim requerit: 1581 min)")
print("="*50)
for nom in sorted(dades_alumnes.keys()):
minuts_totals = dades_alumnes[nom]
if minuts_totals >= 1581:
estat = "✅ Supera el 80%"
else:
estat = "❌ No arriba"
h = minuts_totals // 60
m = minuts_totals % 60
print(f"{nom}: {minuts_totals} minuts ({h}h {m}m) -> {estat}")