Leer y escribir 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 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.

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *