import re import unicodedata from typing import Any def strip_accents(value: str) -> str: normalized = unicodedata.normalize('NFKD', value) return ''.join(char for char in normalized if not unicodedata.combining(char)) def normalize_key(value: str) -> str: value = strip_accents(str(value or '')).lower().strip() value = re.sub(r'[^a-z0-9]+', '_', value) value = re.sub(r'_+', '_', value).strip('_') return value def clean_cell(value: Any) -> str | None: if value is None: return None text = str(value).strip() if text == '' or text.lower() in {'nan', 'none', 'na'}: return None return text def to_float(value: Any) -> float | None: text = clean_cell(value) if text is None: return None text = text.replace(',', '.') text = re.sub(r'[^0-9+\-.]', '', text) if text in {'', '+', '-', '.', '+.', '-.'}: return None try: return float(text) except ValueError: return None