Post Top Ad

Your Ad Spot

martes, 25 de junio de 2019

Leyendo y escribiendo archivos CSV con Node.js

Introducción

El término CSV es una abreviatura que significa valores separados por comas .
Un archivo CSV es un archivo de texto plano que contiene datos formateados de acuerdo con el estándar CSV. Tiene líneas distintas que representan registros y cada campo en el 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 el formato CSV?
Existen varios enfoques para resolver este problema, por ejemplo, podríamos resumir dichos valores entre comillas dobles. Sin embargo, algunas de las implementaciones de CVS no admiten esta característica por diseño.

Estandarización CSV

Uno de los estándares CSV más utilizados se describe en el RFC4180 .
De acuerdo con esto, el formato CSV está descrito por estas 7 reglas:
  1. Cada registro se ubica en una línea separada, delimitada por un salto de línea (CRLF).
  2. El último registro en el archivo puede o no tener un salto de línea final.
  3. 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á nombres correspondientes a los campos en el archivo y debe contener el mismo número de campos que los registros en el resto del archivo (la presencia o ausencia de la línea del encabezado debe indicarse mediante el parámetro opcional "encabezado" de este Tipo MIME).
  4. Dentro del encabezado y 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.
  5. Cada campo puede o no incluirse entre comillas dobles (sin embargo, algunos programas, como Microsoft Excel, no usan comillas dobles). Si los campos no están encerrados entre comillas dobles, entonces las comillas dobles pueden no aparecer dentro de los campos.
  6. Los campos que contienen saltos de línea (CRLF), comillas dobles y comas deben incluirse entre comillas dobles.
  7. Si se usan comillas dobles para encerrar campos, entonces una comilla doble que aparece dentro de un campo debe escaparse precediéndolo con otra comilla doble.
Si está interesado en leer más con múltiples ejemplos, puede estudiar el documento RFC4180 original, vinculado anteriormente.

Leyendo archivos CSV en Node.js

Para leer un archivo CSV en Node.js, no podríamos usar nada más que solo el fsmódulo, ya que en esencia el archivo CSV es un archivo de texto plano.
Si está interesado en leer más sobre leer archivos con Node.js o escribir 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 para nosotros. Comenzaremos instalando el módulo csv-parser:
$ npm i -s csv-parser
Luego, coloquemos los datos CSV del principio del artículo en un archivo llamado "data.csv" y seguimos 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');
  });
A continuación, creamos una readStreamutilizando el fsmódulo, la tubería en el csvobjeto que va a continuación, disparar el dataevento cada vez que se procesa una nueva fila del archivo CSV. El endevento se activa cuando se procesan todas las filas del archivo CSV y registramos un mensaje corto en la consola para indicar eso.
Para fines de demostración, solo console.logprocesamos cada fila y después de ejecutar el código, verá esta salida 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  

Escribiendo archivos CSV en Node.js

Al recordar el hecho de que los archivos CSV son sólo archivos de texto plano, siempre podríamos limitarnos a usar solamente el nativo fsmódulo, pero para hacer nuestra vida más fácil, vamos a utilizar otro común npmmó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'));
El csv-writermódulo requiere una configuración inicial donde le proporcionamos el nombre del archivo CSV resultante y la headerconfiguración.
Nota : en nuestro objeto de JavaScript, todas las propiedades están en minúsculas, pero en el archivo CSV, las primeras letras deben estar en mayúsculas.
Una vez realizada la configuración, todo lo que tenemos que hacer es llamar a la writeRecordsfunción, pasar la datamatriz que representa la estructura de datos que se debe escribir en el archivo CSV.
Una vez que se realiza este proceso, imprimiremos un mensaje informativo a la consola indicando que el programa se ha completado.

Usando el módulo fast-csv

El ecosistema Node.js npmofrece muchas opciones para leer y escribir archivos CSV. Mostraremos otro ejemplo de un módulo CSV popular y observaremos cómo podemos escribir nuestra matriz de datos utilizando el fast-csvmó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, pudimos 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 un formato CSV se usa comúnmente para almacenar datos tabulares estructurados. Muchos npmmódulos proporcionan esta funcionalidad, por lo que debe elegir el que mejor se adapte a sus necesidades y tenga soporte continuo.

No hay comentarios.:

Publicar un comentario

Dejanos tu comentario para seguir mejorando!

outbrain

Páginas