¿Qué es CSV?
CSV son las siglas de Comma-Separated Values (Valores Separados por Comas), un formato de texto plano para representar datos tabulares — filas y columnas — donde cada fila es una línea de texto y las columnas dentro de esa fila están separadas por comas. A pesar de su aparente simplicidad, CSV tiene más casos extremos, errores potenciales y problemas de interoperabilidad que casi cualquier otro formato ubicuo en la informática.
CSV no tiene un estándar oficial único. Lo más cercano a una especificación es la RFC 4180 (2005), que documenta la práctica común sin ser un estándar formal. Diferentes aplicaciones implementan CSV de maneras distintas que causan frecuentes corrupciones de datos cuando los archivos se intercambian entre sistemas.
Reglas de RFC 4180
RFC 4180 define la siguiente estructura:
- Cada registro (fila) está en una línea separada delimitada por
CRLF(\r\n) - El último registro del archivo puede o no tener un salto de línea final
- Un registro de cabecera opcional puede aparecer como primera línea, con los nombres de las columnas
- Dentro de cada registro, los campos están separados por comas
- Cada campo puede o no estar encerrado entre comillas dobles
- Los campos que contienen caracteres especiales (comas, comillas dobles o saltos de línea) deben estar encerrados entre comillas dobles
- Una comilla doble dentro de un campo entrecomillado se escapa precedida de otra comilla doble (
"")
Las Reglas de Entrecomillado en Detalle
¿Cuándo son obligatorias las comillas?
- El campo contiene el carácter delimitador (coma por defecto)
- El campo contiene un carácter de comilla doble
- El campo contiene un salto de línea o retorno de carro
Ejemplos de entrecomillado:
| Valor | Codificación CSV correcta |
|---|---|
hola |
hola o "hola" |
hola, mundo |
"hola, mundo" |
di "hola" |
"di ""hola""" |
línea1\nlínea2 |
"línea1\nlínea2" |
3.14 |
3.14 o "3.14" |
| `` (vacío) | `` o "" |
Variantes de Delimitador
A pesar de que la "C" en CSV significa "coma", los archivos CSV frecuentemente usan otros delimitadores:
| Delimitador | Carácter | Caso de uso habitual |
|---|---|---|
| Coma | , |
Predeterminado para idioma inglés |
| Punto y coma | ; |
Locales europeas (donde , es separador decimal) |
| Tabulador | \t |
Archivos TSV (Tab-Separated Values) |
| Pipe | | |
Evita ambigüedad; archivos de registro |
Los usuarios europeos frecuentemente encuentran el delimitador de punto y coma porque en locales donde el separador decimal es , (p.ej., España: 1.234,56 para mil doscientos treinta y cuatro coma cincuenta y seis), usar comas como delimitadores CSV sería ambiguo. Microsoft Excel usa el carácter separador de listas del sistema al importar/exportar CSV, que es ; en locales europeas.
El Problema de la Codificación
Los archivos CSV no tienen un mecanismo incorporado para declarar su codificación de caracteres. Esto es uno de los mayores problemas prácticos del formato.
UTF-8 con BOM: Algunas aplicaciones (notablemente Excel) añaden una Marca de Orden de Bytes UTF-8 (0xEF 0xBB 0xBF) al inicio del archivo. Otras aplicaciones tratan el BOM como caracteres visibles, introduciendo basura al inicio del primer campo. El módulo csv de Python ignora el BOM cuando se usa encoding='utf-8-sig'.
Windows-1252 frente a UTF-8: Excel en Windows guardaba históricamente los CSV en la página de código ANSI de Windows. Cuando estos archivos se abren en entornos UTF-8, los caracteres como é, ü, ñ se vuelven ilegibles. Especifica siempre la codificación explícitamente al leer CSV mediante programación.
Conversión automática de tipos en Excel: Excel interpreta agresivamente los campos CSV como fechas, números o notación científica:
1-2→ 2 de enero (fecha)1e10→ 10.000.000.000 (notación científica)0001→1(ceros iniciales eliminados)
CSV frente a Excel (XLSX)
| Característica | CSV | XLSX |
|---|---|---|
| Legible por humanos | Sí | No (ZIP+XML) |
| Múltiples hojas | No | Sí |
| Formato | Ninguno | Completo |
| Fórmulas | No | Sí |
| Tipos de datos | Todo texto | Tipado (número, fecha, bool) |
| Tamaño de archivo | Mínimo | Mayor |
| Soporte universal | Sí | Casi universal |
| Declaración de codificación | No | Implícita (UTF-8 en XML) |
| Filas máximas | Ilimitadas | 1.048.576 |
Cuándo usar CSV sobre XLSX:
- Intercambio de datos entre diferentes sistemas de software
- Procesamiento por línea de comandos (grep, awk, sed, csvkit)
- Importación/exportación de bases de datos
- Formato de archivo de registro
- Cuando el tamaño del archivo importa
CSV: Casos Extremos al Analizar
Analizar correctamente CSV requiere manejar:
Campos multilínea: Un campo encerrado entre comillas puede abarcar múltiples líneas. Un analizador línea por línea simplista falla en estos casos.
Delimitador final: Algunos generadores añaden una coma final después del último campo en cada fila. RFC 4180 no lo permite, pero muchos analizadores lo toleran.
NULL frente a cadena vacía: ,, contiene dos cadenas vacías. No hay forma estándar de representar NULL de forma diferente a una cadena vacía en CSV.
Un analizador CSV robusto (el módulo csv.reader de Python, read_csv de pandas, Papa Parse de JavaScript) maneja todos estos casos. Escribir análisis CSV ad-hoc con str.split(',') es una fuente garantizada de errores.
Trabajar con CSV Mediante Programación
Python:
import csv
# Lectura
with open('datos.csv', newline='', encoding='utf-8') as f:
lector = csv.DictReader(f)
for fila in lector:
print(fila['nombre'], fila['edad'])
# Escritura
with open('salida.csv', 'w', newline='', encoding='utf-8') as f:
escritor = csv.DictWriter(f, fieldnames=['nombre', 'edad', 'ciudad'])
escritor.writeheader()
escritor.writerow({'nombre': 'Alicia', 'edad': 30, 'ciudad': 'Madrid'})
pandas:
import pandas as pd
df = pd.read_csv('datos.csv', encoding='utf-8', dtype=str) # dtype=str evita la autoconversión
df.to_csv('salida.csv', index=False)
Conversión de Archivos CSV
CSV → XLSX: Abrir en Excel, verificar tipos de datos, guardar como XLSX. Mediante programación: pandas.DataFrame.to_excel() u openpyxl.
CSV → JSON: Cada fila se convierte en un objeto; la fila de cabecera proporciona los nombres de las claves. Muchas herramientas manejan esto: csvkit, Python con los módulos csv + json.
CSV → SQL: Herramientas como csvsql de csvkit generan sentencias CREATE TABLE e INSERT a partir de CSV.
CSV → Parquet/Arrow: Para cargas de trabajo analíticas, convertir CSV a formatos en columnas acelera drásticamente las consultas.
Resumen
CSV es simultáneamente el formato de intercambio de datos más simple y más traicionero de uso común. Su simplicidad — texto plano, sin dependencias, legible por humanos — lo convierte en el recurso universal de reserva para el intercambio de datos tabulares. Sus ambigüedades — codificación no declarada, delimitador indefinido, NULL indistinguible de cadena vacía, conversiones de tipo de Excel — lo convierten en la fuente de más corrupción silenciosa de datos que casi cualquier otro formato. Usa una biblioteca CSV adecuada, especifica siempre la codificación explícitamente y verifica los tipos de datos después de importar. Cuando la estructura y los tipos importan más que la compatibilidad, usa XLSX o JSON.
Conversiones relacionadas
Conversiones de documento que siguen este tema: