📊

CSV

CSV (Comma-Separated Values) es un formato de archivo de texto plano para datos tabulares. Cada línea representa una fila y los valores se separan por comas (o punto y coma en regiones que usan coma como separador decimal).

CSV es uno de los formatos de datos más antiguos y ubicuos. Apareció en los 70 para intercambio de datos entre mainframes. Su popularidad se debe a su simplicidad extrema: texto plano, sin metadatos, sin compresión.

Estructura básica:

nombre,edad,ciudad\nJuan,30,Buenos Aires\nMaría,25,Montevideo

Primera fila típicamente contiene headers (nombres de columnas). Cada fila subsecuente es un registro. Los valores se separan por comas, aunque el separador puede ser punto y coma (;), tab (\t) o pipe (|) según configuración regional.

CSV es el formato de exportación por defecto en Excel, Google Sheets, bases de datos SQL y herramientas analíticas. Todo lenguaje de programación tiene bibliotecas nativas para leer/escribir CSV: csv en Python, csv-parse en Node, encoding/csv en Go.

Ventaja clave: universalidad. Un CSV de 1980 se abre hoy en cualquier editor de texto. No hay lock-in de vendor ni versiones incompatibles.

Aunque CSV parece trivial, tiene sutilezas que rompen parsers ingenuos:

  • Valores con comas: si un campo contiene el separador, debe ir entre comillas: "Pérez, Juan",30,CABA.
  • Comillas dentro de valores: se escapan duplicándolas: "Dijo ""hola"" y se fue" representa Dijo "hola" y se fue.
  • Saltos de línea en campos: valores multilínea van entre comillas: "Primera línea\nSegunda línea",otro,valor.
  • Separador regional: Europa usa ; porque usan coma como separador decimal (3,14 en lugar de 3.14). Excel exporta según configuración del sistema.
  • Encoding: el estándar no especifica charset. UTF-8 es recomendado, pero muchos sistemas viejos usan Latin-1 o Windows-1252, causando problemas con acentos.

RFC 4180 (2005) intentó estandarizar CSV, pero la adopción es parcial. Muchos exportadores generan "CSV compatible con Excel" que rompe otros parsers.

BOM (Byte Order Mark): Excel requiere \uFEFF al inicio del archivo UTF-8 para detectar encoding correctamente. Otros parsers lo ignoran o rechazan.

Exportar datos de bases de datos: PostgreSQL (COPY TO), MySQL (SELECT INTO OUTFILE), SQLite (.mode csv) exportan a CSV nativamente. Ideal para backups livianos o migrar datos entre sistemas.

Análisis con Excel/Google Sheets: stakeholders no-técnicos pueden abrir CSV directamente. Para dashboards simples o reportes ad-hoc, CSV + Sheets es más rápido que armar un BI.

ETL y data pipelines: herramientas como Apache Spark, Pandas, dbt ingieren CSV sin configuración. S3 + CSV es arquitectura común para data lakes.

Datasets públicos: gobierno, universidades, Kaggle publican datos en CSV porque es el formato más portable. No requiere software especial para consumir.

No usar para:

  • Datos jerárquicos/nested: CSV es estrictamente tabular. Para relaciones anidadas (ej: usuario → órdenes → items) necesitás JSON o Parquet.
  • Archivos grandes (>1GB): CSV sin compresión ocupa mucho espacio y es lento de parsear. Preferí Parquet (columnar + compresión) o CSV.gz.
  • Tipos de datos complejos: CSV no tiene tipos nativos. Todo es string hasta que el parser infiere. Fechas, booleans y nulls son ambiguos.
  • Seguridad: CSV injection existe. Campos que empiezan con =, +, -, @ pueden ejecutar fórmulas en Excel. Sanitizá inputs.

CSV vs JSON:

  • CSV gana en simplicidad, peso y compatibilidad con herramientas analíticas.
  • JSON gana en expresividad (anidamiento, tipos nativos) y es estándar para APIs.
  • Regla práctica: si los datos son tabulares y van a Sheets/SQL, usá CSV. Si van a una app web o tienen jerarquía, usá JSON.

CSV vs Parquet:

  • Parquet es formato columnar binario, optimizado para BigData (Spark, Hive, Redshift).
  • 10-100x más eficiente en storage y queries analíticos (lee solo columnas necesarias).
  • CSV gana si necesitás inspeccionar datos con cat o editarlos manualmente.

CSV vs Excel (.xlsx):

  • Excel soporta múltiples sheets, fórmulas, formato y validación. CSV es single-sheet, solo datos.
  • Excel es binario (zip + XML), más pesado. CSV es texto plano.
  • CSV gana en automatización: es más fácil generar/parsear programáticamente.

Mejores prácticas:

  • Siempre incluí header row con nombres descriptivos.
  • Usá UTF-8 + BOM si el target es Excel.
  • Escapá comillas y saltos de línea según RFC 4180.
  • Comprimí CSVs grandes con gzip (CSV.gz reduce 80-90%).
  • Versioná con Git (texto plano = diffs legibles).

Ejemplos

  • nombre,edad,ciudad\nCarlos,28,Rosario\nLaura,32,Córdoba
  • producto,precio,stock\n"Laptop, 15\"",1200.50,15\nMouse,25.00,200
  • fecha,temperatura,humedad\n2024-01-15,22.5,65\n2024-01-16,24.0,60
  • id;descripción;activo\n1;"Item con; separador";true\n2;Normal;false
  • usuario,rol,"permisos"\nadmin,superuser,"leer,escribir,borrar"\nguest,readonly,leer

Preguntas frecuentes

¿CSV tiene un estándar oficial?

Sí y no. RFC 4180 (2005) define un estándar, pero muchas implementaciones pre-datan ese RFC y tienen comportamientos distintos. En la práctica, "CSV compatible con Excel" es el estándar de facto, aunque no está formalmente especificado.

¿Cómo manejo valores nulos en CSV?

CSV no tiene representación estándar de null. Opciones: campo vacío (,,), string literal "NULL" o "N/A", o convención específica del parser (Pandas usa NaN). Documentá la convención en tu proyecto para evitar ambigüedad.

¿Qué es CSV injection?

Vulnerability donde campos CSV maliciosos (empezando con =, +, -, @) se interpretan como fórmulas en Excel, ejecutando comandos. Mitigación: escapar esos caracteres con apóstrofe ('=cmd) o validar inputs. Afecta solo a parsers tipo Excel, no a herramientas analíticas.