export function normalizeHeader(value: string): string { return value .toLowerCase() .normalize('NFD') .replace(/[\u0300-\u036f]/g, '') .replace(/[^a-z0-9 ]/gi, '') .trim() .replace(/\s+/g, '_'); } export function cleanNum(value: unknown): number { if (value === null || value === undefined || value === '') return NaN; if (typeof value === 'number') return value; const str = String(value).trim().replace(/[^0-9.\-]/g, ''); if (str === '' || str === '-' || str === '.') return NaN; const num = Number(str); return Number.isFinite(num) ? num : NaN; } export function normalizeRow(row: Record): Record { const out: Record = {}; for (const key in row) { const newKey = normalizeHeader(key); let val = row[key]; if (typeof val === 'string') val = val.trim(); out[newKey] = val; } return out; }