¿Cómo extraer datos de un fichero csv con Javascript?

publicado por: Anonymous

Necesito saber como puedo leer y separar datos de un fichero CSV que contiene solo valores numéricos en Javascript.

Por ejemplo el archivo tiene 3 columnas de números separados por comas y 4 filas, como ser:

1,2,3
1,2,3
1,2,3
1,2,3

La idea es que pueda almacenar la primer columna en un array, la segunda en otro y la tercera en otro, es decir, el resultado final que busco es:

array1=[1,1,1,1];
array2=[2,2,2,2];
array3=[3,3,3,3];

Desde ya muchas gracias. Aclaro que se trata de un archivo que puede subir el usuario.

solución

Una solución (básica) podría ser la siguiente:

  • Si el archivo es cargado manualmente, podemos usar un input type="file" sobre el cual vamos a detectar el evento change
  • Para leer el contenido del archivo cargado en el input, podemos usar FileReader.

Ejemplo:

_x000D_

_x000D_

function parseCSV(text) {
  // Obtenemos las lineas del texto
  let lines = text.replace(/r/g, '').split('n');
  return lines.map(line => {
    // Por cada linea obtenemos los valores
    let values = line.split(',');
    return values;
  });
}

function reverseMatrix(matrix){
  let output = [];
  // Por cada fila
  matrix.forEach((values, row) => {
    // Vemos los valores y su posicion
    values.forEach((value, col) => {
      // Si la posición aún no fue creada
      if (output[col] === undefined) output[col] = [];
      output[col][row] = value;
    });
  });
  return output;
}

function readFile(evt) {
  let file = evt.target.files[0];
  let reader = new FileReader();
  reader.onload = (e) => {
    // Cuando el archivo se terminó de cargar
    let lines = parseCSV(e.target.result);
    let output = reverseMatrix(lines);
    console.log(output);
  };
  // Leemos el contenido del archivo seleccionado
  reader.readAsBinaryString(file);
}

document.getElementById('file').addEventListener('change', readFile, false);

_x000D_

<input type="file" id="file" />

_x000D_

_x000D_

_x000D_

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *