Definición
Un CSV es un fichero de texto donde cada línea es una fila y los campos van separados por un carácter, normalmente una coma. La primera línea suele contener los nombres de las columnas.
Su virtud es que lo lee todo el mundo: cualquier hoja de cálculo, cualquier lenguaje, cualquier sistema de gestión. Por eso sigue siendo el formato de intercambio más habitual entre empresas, muy por delante de JSON o XML en el terreno administrativo.
Su defecto es que es engañosamente simple. Casi no tiene reglas, y eso significa que cada sistema lo genera un poco a su manera.
Las cuatro trampas
El separador. En países que usan la coma como decimal —España incluida—, el separador habitual es el punto y coma, no la coma. Un fichero exportado en un ordenador y abierto en otro puede acabar con todo en una sola columna.
La codificación. Si el fichero no está en la codificación esperada, las tildes y las eñes se convierten en símbolos raros. Y hay un detalle específico: para que una hoja de cálculo reconozca correctamente el texto, a veces necesita una marca especial al principio del fichero — sin ella, muestra los acentos mal aunque el fichero sea correcto.
Comillas y comas dentro de los campos. Una dirección como Calle Mayor, 3 contiene una coma. La convención es rodear el campo con comillas, y entonces hay que resolver qué pasa con las comillas dentro del campo. Aquí es donde partir la línea por comas deja de funcionar y hace falta un analizador de verdad. Ver expresión regular.
Los números y las fechas. El mismo valor puede venir con coma o con punto decimal, con separador de miles o sin él, y las fechas en tres órdenes distintos.
Ejemplo práctico
Importar tarifas de proveedores es el caso donde el CSV enseña todo lo que puede salir mal.
Lo que aprendí procesando ficheros reales: tres sorpresas que no aparecen en ninguna documentación y que hay que contemplar siempre.
Referencias convertidas en notación científica. Una hoja de cálculo puede interpretar un código como un número enorme y guardarlo en notación abreviada. Al leerlo, la referencia original ya no existe: se ha perdido en la exportación, no en la importación.
Caracteres invisibles. Espacios que no son espacios normales, marcas de dirección de texto, saltos ocultos. El valor parece idéntico y no coincide con nada al compararlo.
Formato numérico mezclado dentro del mismo fichero. Unas filas con coma decimal y otras con punto, porque el fichero se ha ido montando a mano en varias tandas. Detectar el formato una sola vez para todo el fichero produce importaciones silenciosamente incorrectas: los precios entran multiplicados o divididos por mil y nadie lo ve hasta que un cliente reclama.
De ahí la regla que aplico siempre: la detección de formato se decide por celda, no por fichero, y ante ambigüedad se para y se pregunta.
El segundo aprendizaje, sobre el proceso: toda importación necesita una previsualización antes de escribir nada. Enseñar las primeras filas ya interpretadas —columnas detectadas, valores convertidos, filas descartadas y por qué— evita la mayoría de los desastres, porque el error se ve antes de tocar la base de datos.
Y un segundo hábito igual de barato: guardar el fichero original tal cual llegó. Cuando algo salga raro dentro de un mes, es lo único que permite reconstruir qué pasó.
Y una advertencia sobre editar CSV en una hoja de cálculo: abrir un CSV, mirarlo y guardarlo puede alterarlo — códigos con ceros a la izquierda que los pierde, referencias convertidas a número, fechas reinterpretadas. Si un fichero tiene que llegar intacto, no se abre con una hoja de cálculo.
Errores comunes
- Asumir la coma como separador.
- No fijar la codificación.
- Partir la línea por comas en vez de usar un analizador.
- Detectar el formato numérico globalmente y no por celda.
- No limpiar caracteres invisibles.
- Importar sin previsualización.
- No guardar el original.
- Abrir y guardar en Excel un fichero que debía llegar intacto.
Cuándo usarlo
Para intercambiar datos tabulares con sistemas y personas que no comparten tu tecnología. Sigue siendo la opción más práctica para eso.
Y para intercambio entre sistemas propios, con datos anidados o tipos definidos, JSON es mejor elección: no tiene ninguna de estas ambigüedades.