El formato CSV (Valores Separados por Comas) es uno de los estándares más antiguos y populares para el intercambio de datos estructurados planos. A pesar de su aparente simplicidad, escribir un analizador (parser) de CSV en JavaScript es una tarea propensa a fallos si se subestima su complejidad interna.

Un error clásico y recurrente entre los desarrolladores principiantes es intentar parsear las líneas de un CSV utilizando expresiones regulares sencillas o el método nativo String.prototype.split(','). Esta aproximación falla drásticamente al encontrarse con datos reales del mundo de los negocios. A continuación, analizamos las razones técnicas y cómo construir un parser conforme a la norma **RFC 4180**.

Por qué falla split(','): Si una de tus celdas contiene una coma como parte de su valor textual (por ejemplo: "Pérez, Juan") o un salto de línea físico dentro del campo, un simple split segmentará esa celda de forma errónea, descuadrando el recuento total de columnas y corrompiendo la estructura de datos importada.

Las Especificaciones Clave de la Norma RFC 4180

La RFC 4180 define las pautas formales para la estructura de archivos CSV:

  1. Separación por comas o delimitadores específicos: Cada campo está separado por comas (o tabuladores en TSV).
  2. Delimitación por Comillas Dobles: Los campos que contienen comas, saltos de línea (CRLF) o comillas dobles deben estar envueltos por comillas dobles (por ejemplo, "celda, con coma").
  3. Escapado de Comillas: Si una comilla doble aparece dentro de un campo ya delimitado por comillas, esta debe escaparse anteponiendo otra comilla doble (representada como "").

Implementación de una Máquina de Estados Finita (FSM)

La manera robusta de parsear esta sintaxis consiste en recorrer la cadena de texto carácter por carácter utilizando un autómata o **Máquina de Estados Finita (FSM)**. Esta máquina mantiene un estado interno para saber si el puntero de lectura se encuentra actualmente "dentro de un campo entrecomillado" o "fuera de él".

A continuación se detalla la lógica algorítmica simplificada que implementamos en nuestro Editor de Tablas:

function parseCSV(text, delimiter = ',') {
  let rows = [[]];
  let field = "";
  let inQuotes = false;
  
  for (let i = 0; i < text.length; i++) {
    let char = text[i];
    let nextChar = text[i + 1];
    
    if (inQuotes) {
      if (char === '"') {
        if (nextChar === '"') {
          // Comilla escapada ("") -> añadimos una sola comilla al campo
          field += '"';
          i++; // Saltamos la comilla duplicada
        } else {
          // Salimos de las comillas
          inQuotes = false;
        }
      } else {
        field += char;
      }
    } else {
      if (char === '"') {
        inQuotes = true;
      } else if (char === delimiter) {
        rows[rows.length - 1].push(field);
        field = "";
      } else if (char === '\r' || char === '\n') {
        rows[rows.length - 1].push(field);
        field = "";
        if (char === '\r' && nextChar === '\n') {
          i++; // Saltamos el LF de la secuencia CRLF
        }
        if (i < text.length - 1) {
          rows.push([]);
        }
      } else {
        field += char;
      }
    }
  }
  rows[rows.length - 1].push(field);
  return rows;
}

Ventajas de la FSM Client-Side

Al implementar este algoritmo directamente en JavaScript local:

  • Manejo de Celdas Multilínea: El parser soporta saltos de línea embebidos dentro de celdas de texto sin romper la cuadrícula visual.
  • Eficiencia en Memoria: El bucle de paso único (O(N)) permite procesar miles de caracteres instantáneamente sin sobrecargar la CPU del navegador.
  • Seguridad de Datos Absoluta: No dependemos de librerías NPM de terceros propensas a vulnerabilidades de cadena de suministro o inflación de dependencias.

Conocer y aplicar los estándares formales de datos garantiza que las herramientas web de productividad sean resilientes ante la variedad de formatos del ecosistema empresarial. Te invitamos a probar la solidez de nuestro parseador local arrastrando tus hojas de cálculo en nuestro Editor de Tablas Offline.