Leer y escribir archivos CSV con Node.js

L

 

Introducción

El término CSV es una abreviatura que significa valores separados por comas.

Un archivo CSV es un archivo de texto sin formato que contiene datos formateados según el estándar CSV. Tiene líneas distintas que representan registros y cada campo del registro está separado de otro por una coma.

Es muy conveniente almacenar datos tabulares en CSV:

Name,Surname,Age,Gender
John,Snow,26,M
Clair,White,33,F
Fancy,Brown,78,F

Aquí, la primera fila representa los títulos de las columnas / campos de nuestros registros CSV y luego hay 3 registros que representan a ciertas personas. Como puede ver, los valores están delimitados por comas y cada registro comienza en una nueva fila.

Oye, pero ¿qué pasa si queremos incluir comas o saltos de línea en algunos de los campos que están almacenados en formato CSV?

Hay varios enfoques para resolver este problema, por ejemplo, podríamos envolver dichos valores entre comillas dobles. Sin embargo, algunas de las implementaciones de CVS no admiten esta función por diseño.

Estandarización CSV

Uno de los estándares CSV más utilizados se describe en el RFC4180.

Según él, el formato CSV se describe mediante estas 7 reglas:

  • Cada registro está ubicado en una línea separada, delimitada por un salto de línea (CRLF).
  • El último registro del archivo puede tener o no un salto de línea final.
  • Puede haber una línea de encabezado opcional que aparece como la primera línea del archivo con el mismo formato que las líneas de registro normales. Este encabezado contendrá los nombres correspondientes a los campos del archivo y debe contener el mismo número de campos que los registros del resto del archivo (la presencia o ausencia de la línea del encabezado debe indicarse mediante el parámetro opcional “encabezado” de este Tipo de Mimica).
  • Dentro del encabezado y de cada registro, puede haber uno o más campos, separados por comas. Cada línea debe contener el mismo número de campos en todo el archivo. Los espacios se consideran parte de un campo y no deben ignorarse. El último campo del registro no debe ir seguido de una coma.
  • Cada campo puede estar entre comillas dobles o no (sin embargo, algunos programas, como Microsoft Excel, no utilizan comillas dobles). Si los campos no están entre comillas dobles, es posible que las comillas dobles no aparezcan dentro de los campos.
  • Los campos que contienen saltos de línea (CRLF), comillas dobles y comas deben incluirse entre comillas dobles.
  • Si se utilizan comillas dobles para encerrar campos, entonces una comilla doble que aparece dentro de un campo debe escaparse precediéndola con otra comilla doble.

Si está interesado en leer más con varios ejemplos, puede estudiar el documento RFC4180 original, vinculado anteriormente.

Leer archivos CSV en Node.js

Para leer un archivo CSV en Node.js, no podríamos usar nada más que solo el fs módulo, ya que en esencia el archivo CSV es un archivo de texto sin formato.

Si está interesado en leer más sobre la lectura de archivos con Node.js o la escritura de archivos con Node.js, ¡tenemos ambos cubiertos!

Sin embargo, hay un par de módulos útiles que podrían manejar la generación o el análisis del contenido CSV por nosotros. Empezaremos instalando el módulo csv-parser:

$ npm i -s csv-parser

Luego, coloquemos los datos CSV desde el principio del artículo en un archivo llamado “data.csv” y sigamos con un ejemplo muy simple:

const csv = require('csv-parser');
const fs = require('fs');

fs.createReadStream('data.csv')
  .pipe(csv())
  .on('data', (row) => {
    console.log(row);
  })
  .on('end', () => {
    console.log('CSV file successfully processed');
  });

Aquí, creamos un readStream utilizando la fs módulo, póngalo en el csv objeto que luego disparará el data evento cada vez que se procesa una nueva fila del archivo CSV. los end El evento se activa cuando se procesan todas las filas del archivo CSV y registramos un mensaje corto en la consola para indicarlo.

Para fines de demostración, solo console.log cada fila procesada y después de ejecutar el código, verá este resultado en su consola:

Row {
  Name: 'John',
  'Surname': 'Snow',
  'Age': '26',
  'Gender': 'M' }
Row {
  Name: 'Clair',
  'Surname': 'White',
  'Age': '33',
  'Gender': 'F' }
Row {
  Name: 'Fancy',
  'Surname': 'Brown',
  'Age': '78',
  'Gender': 'F' }
CSV file successfully processed

Escribir archivos CSV en Node.js

Recordando el hecho de que los archivos CSV son solo archivos de texto sin formato, siempre podemos limitarnos a usar solo los archivos nativos fs módulo, pero para hacernos la vida más fácil, usaremos otro módulo común npm módulo, csv-writer.

Primero va la instalación:

$ npm i -s csv-writer

Luego, el código:

const createCsvWriter = require('csv-writer').createObjectCsvWriter;
const csvWriter = createCsvWriter({
  path: 'out.csv',
  header: [
    {id: 'name', title: 'Name'},
    {id: 'surname', title: 'Surname'},
    {id: 'age', title: 'Age'},
    {id: 'gender', title: 'Gender'},
  ]
});

const data = [
  {
    name: 'John',
    surname: 'Snow',
    age: 26,
    gender: 'M'
  }, {
    name: 'Clair',
    surname: 'White',
    age: 33,
    gender: 'F',
  }, {
    name: 'Fancy',
    surname: 'Brown',
    age: 78,
    gender: 'F'
  }
];

csvWriter
  .writeRecords(data)
  .then(()=> console.log('The CSV file was written successfully'));

los csv-writer El módulo requiere una configuración inicial donde le proporcionamos el nombre del archivo CSV resultante y el header configuración.

Nota: En nuestro objeto JavaScript, todas las propiedades están en minúsculas, pero en el archivo CSV las primeras letras de ellas deben estar en mayúscula.

Una vez finalizada la configuración, todo lo que tenemos que hacer es llamar al writeRecords función, pase en el data matriz que representa la estructura de datos que se debe escribir en el archivo CSV.

Una vez finalizado este proceso, imprimiremos un mensaje informativo en la consola indicando que el programa se ha completado.

Usando el módulo fast-csv

El ecosistema de Node.js y npm proporciona muchas opciones para leer y escribir archivos CSV. Mostraremos otro ejemplo de un módulo CSV popular y veremos cómo podemos escribir nuestra matriz de datos usando el fast-csv módulo como alternativa.

Primero, tenemos que instalar el módulo:

$ npm i -s fast-csv
const fastcsv = require('fast-csv');
const fs = require('fs');
const ws = fs.createWriteStream("out.csv");
fastcsv
  .write(data, { headers: true })
  .pipe(ws);

La API es un poco diferente, pero el resultado es idéntico. En solo un par de líneas de código, logramos escribir la matriz de objetos JavaScript en un archivo CSV que luego podría ser utilizado por una variedad de otras aplicaciones.

Conclusión

Leer y escribir archivos CSV con Node.js es una tarea de desarrollo común, ya que el formato CSV se usa comúnmente para almacenar datos tabulares estructurados. Muchos npm Los módulos proporcionan esta funcionalidad, por lo que debe elegir el que mejor se adapte a sus necesidades y tenga soporte continuo.

 

About the author

Ramiro de la Vega

Bienvenido a Pharos.sh

Soy Ramiro de la Vega, Estadounidense con raíces Españolas. Empecé a programar hace casi 20 años cuando era muy jovencito.

Espero que en mi web encuentres la inspiración y ayuda que necesitas para adentrarte en el fantástico mundo de la programación y conseguir tus objetivos por difíciles que sean.

Add comment

Sobre mi

Últimos Post

Etiquetas

Esta web utiliza cookies propias para su correcto funcionamiento. Al hacer clic en el botón Aceptar, aceptas el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad