Saltar al contenido principal
eLearner.app
Módulo 8 · Lección 2 de 430/32 en el curso~15 min
Lecciones del módulo (2/4)

Desafío: parser de CSV

El formato CSV (Comma-Separated Values) está en todas partes: exportaciones de Excel, volcados de bases de datos, salidas de herramientas de línea de comandos. Parsearlo es un pequeño desafío que combina split, map, destructuring y construcción de objetos.

El formato

Un CSV mínimo es una cadena multilinea: la primera línea es el encabezado (nombres de las columnas), luego hay una línea por cada registro con los campos separados por comas.

Code
nome,eta,citta
Alice,30,Roma
Bob,25,Milano

El objetivo clásico es transformarlo en un array de objetos:

JS
[
  { nome: 'Alice', eta: '30', citta: 'Roma' },
  { nome: 'Bob', eta: '25', citta: 'Milano' },
];

La receta en 3 pasos

  1. Divide la cadena por líneas: csv.split('\n')
  2. Extrae la línea del encabezado: la primera línea, dividida por comas
  3. Mapea cada línea restante a un objeto, asociando cada campo con su encabezado correspondiente
JS
function parseCSV(csv) {
  const righe = csv.split('\n');
  const intestazione = righe[0].split(',');
  return righe.slice(1).map((riga) => {
    const campi = riga.split(',');
    const record = {};
    intestazione.forEach((nome, i) => {
      record[nome] = campi[i];
    });
    return record;
  });
}

Alternativas más modernas:

JS
const record = Object.fromEntries(intestazione.map((nome, i) => [nome, campi[i]]));

Convertir tipos

Los campos parseados son siempre strings. Si sabes que algunas columnas contienen números:

JS
record.eta = Number(record.eta);

O puedes escribir un pequeño "esquema":

JS
const numeriche = new Set(['eta', 'prezzo']);
intestazione.forEach((nome, i) => {
  const v = campi[i];
  record[nome] = numeriche.has(nome) ? Number(v) : v;
});

Pruébalo tú

Ejercicio#js.m8.l2.e1
Intentos: 0Cargando...

Define `parseCSV(csv)` que reciba una cadena CSV (primera línea = encabezado, comas como separador). Devuelve un array de objetos con las claves del encabezado. Todos los valores siguen siendo strings. Ignora las líneas vacías.

Cargando editor...
Mostrar pista

split su newline, prima riga = intestazione, map sulle altre, Object.fromEntries.

Solución disponible después de 3 intentos

Ejercicio de repaso

Ejercicio#js.m8.l2.e2
Intentos: 0Cargando...

Define `columnMean(csv, columnName)` que parsee el CSV, convierta los valores de la columna a números y devuelva su media (numero). Si no hay líneas de datos, devuelve 0.

Cargando editor...
Mostrar pista

Trova l'indice della colonna, mappa righe → Number, reduce somma, dividi per length.

Solución disponible después de 3 intentos