104 lines
3.5 KiB
Python
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}") |