Leer y escribir archivos CSV en Node.js con node-csv

    Introducción

    Una tarea de desarrollo común es leer datos de archivos. Un formato de archivo común es el .csv formato.

    Si bien puede leer archivos CSV con el fs módulo que viene con Node y obtener el contenido del archivo, en la mayoría de los casos, el análisis y la conversión posterior es mucho más fácil con la ayuda de módulos hechos exactamente para ese propósito.

    Múltiples módulos proporcionan capacidades como la neat-csv o csv-parser paquetes. Sin embargo, en este artículo usaremos node-csv – un conjunto de paquetes CSV para generar, analizar, transformar y encadenar datos CSV.

    Instalación de node-csv

    El módulo consta de csv-generate, csv-parse, csv-transform y csv-stringify paquetes.

    Puede instalar todo el paquete o cada paquete uno por uno si no los necesita todos. Inicialicemos un proyecto de node con la configuración predeterminada:

    $ npm init -y
    

    Entonces, instalemos todo node-csv suite:

    $ npm install node-csv
    

    Trabajaremos con un archivo CSV con estos contenidos:

    Account Name,Account Code,Type,Description
    Cash,101,Assets,Checking account balance
    Wages Payable,220,Liabilities,Amount owed to employes for hours not yet paid
    Rent expense,560,Expenses,Cost of occupied rented facilities during accounting period
    

    Lectura de archivos CSV con csv-parse

    Para leer archivos CSV, usaremos el csv-parse paquete de node-csv.

    los csv-parse El paquete proporciona múltiples enfoques para analizar archivos CSV, usando devoluciones de llamada, una transmisión + devolución de llamada, así como la API Sync y Async. Cubriremos la API stream + callback y la API Sync.

    API Stream + Callback

    Creemos un archivo, llamado index.js y construir un parser:

    var fs = require('fs'); 
    var parse = require('csv-parse');
    var parser = parse({columns: true}, function (err, records) {
    	console.log(records);
    });
    
    fs.createReadStream(__dirname+'/chart-of-accounts.csv').pipe(parser);
    

    Primero, importamos el módulo del sistema de archivos nativo (fs) y el csv-parse módulo. Luego, creamos un parser que acepta un objeto literal, que contiene las opciones que nos gustaría establecer. El segundo argumento es la función de devolución de llamada que se usa para acceder a los registros, o simplemente imprimirlos, en nuestro caso.

    Las opciones que podemos establecer no son obligatorias. En la mayoría de los casos, utilizará cualquiera de los delimiter, cast o columns opciones:

    • los delimitador opción predeterminada a una coma ,. Si los datos del archivo que está intentando analizar utilizan algún otro delimitador como un punto y coma ;o una pipa |, puede especificarlo con esta opción.
    • los emitir opción por defecto es false y se utiliza para indicar si desea convertir las cadenas a sus tipos de datos nativos. Por ejemplo, una columna que se compone de campos de fecha se puede convertir en un Date.
    • los columnas La opción es indicar si desea generar el registro en forma de objetos literales. De forma predeterminada, esta columna se establece en false y el analizador genera los registros en forma de matrices. Si se establece en true, el analizador inferirá el nombre de la columna a partir de la primera línea.

    Finalmente, hemos abierto un flujo de lectura usando el fs módulo y comencé a canalizarlo en el analizador.

    Ejecutemos este archivo:

    $ node index.js
    

    Esto resulta en:

    [
      {
        'Account Name': 'Cash',
        'Account Code': '101',
        Type: 'Assets',
        Description: 'Checking account balance'
      },
      {
        'Account Name': 'Wages Payable',
        'Account Code': '220',
        Type: 'Liabilities',
        Description: 'Amount owed to employes for hours not yet paid'
      },
      {
        'Account Name': 'Rent expense',
        'Account Code': '560',
        Type: 'Expenses',
        Description: 'Cost of occupied rented facilities during accounting period'
      }
    ]
    

    En lugar de simplemente imprimir el contenido, puede manipular estos datos, construir objetos con la información de estos campos o guardarlos en una base de datos, por ejemplo.

    Usando la API de sincronización

    Repliquemos esta funcionalidad usando la API de sincronización:

    var fs = require('fs').promises;
    var parse = require('csv-parse/lib/sync');
    (async function () {
        const fileContent = await fs.readFile(__dirname+'/chart-of-accounts.csv');
        const records = parse(fileContent, {columns: true});
        console.log(records)
    })();
    

    Nuevamente, estamos importando el fs módulo y la API de sincronización del csv-parse módulo.

    Entonces, estamos creando un async función, en la que recuperamos el contenido del archivo por awaiting la respuesta del readFile() función.

    Entonces, podemos crear un parser que toma el contenido del archivo como primer argumento y un objeto literal como segundo. Este objeto literal contiene opciones para crear el analizador (hemos establecido columns a true). Este analizador se asigna a una variable constante y simplemente imprimimos su contenido en aras de la brevedad:

    [
      {
        'Account Name': 'Cash',
        'Account Code': '101',
        Type: 'Assets',
        Description: 'Checking account balance'
      },
      {
        'Account Name': 'Wages Payable',
        'Account Code': '220',
        Type: 'Liabilities',
        Description: 'Amount owed to employes for hours not yet paid'
      },
      {
        'Account Name': 'Rent expense',
        'Account Code': '560',
        Type: 'Expenses',
        Description: 'Cost of occupied rented facilities during accounting period'
      }
    ]
    

    Escribir archivos CSV usando CSV Stringify

    De manera similar a la lectura, a veces nos gustaría escribir datos en formato CSV. Para esto, usaremos el csv-stringify paquete del node-csv suite. Stringification solo significa que convertiremos algunos datos (JSON en nuestro ejemplo) en una cadena. Luego, esta cadena se escribe en un archivo, en formato CSV.

    Supongamos que tiene algunos contenidos JSON que le gustaría escribir como un archivo CSV:

    var someData = [
        {
            "Country": "Nigeria",
            "Population": "200m",
            "Continent": "Africa",
            "Official Language(s)": "English"
        },
        {
            "Country": "India",
            "Population": "1b",
            "Continent": "Asia",
            "Official Language(s)": "Hindi, English"
        },
        {
            "Country": "United States of America",
            "Population": "328m",
            "Continent": "North America",
            "Official Language": "English"
        },
        {
            "Country": "United Kingdom",
            "Population": "66m",
            "Continent": "Europe",
            "Official Language": "English"
        },
        {
            "Country": "Brazil",
            "Population": "209m",
            "Continent": "South America",
            "Official Language": "Portugese"
        }
    ]
    

    los csv-stringify El paquete también tiene un par de opciones de API, sin embargo, la API de devolución de llamada ofrece una forma realmente simple de clasificar los datos, sin la necesidad de manejar eventos como con la API de Stream.

    Sigamos adelante y clasifiquemos los datos anteriores, antes de escribirlos en un archivo:

    var fs = require('fs');
    var stringify = require('csv-stringify');
        
    stringify(someData, {
        header: true
    }, function (err, output) {
        fs.writeFile(__dirname+'/someData.csv', output);
    })
    

    Aquí, estamos importando el fs y csv-stringify módulos. Luego, usando el stringify() función, proporcionamos los datos que nos gustaría convertir en una cadena. También hemos proporcionado un objeto literal que contiene el header opción. Finalmente, también hay una función de devolución de llamada que se usa para escribir el contenido en un archivo.

    Otras opciones como cast, columns y delimiter también están disponibles. En nuestro caso, estamos estableciendo header opción a true para decirle al stringifier que genere los nombres de columna en el primer registro.

    La ejecución de este código genera un archivo con el contenido adecuado:

    Conclusión

    los node-csv module es un conjunto de módulos más pequeños que se utilizan para leer / analizar, transformar y escribir datos CSV desde y hacia archivos.

    Hemos usado el csv-parse módulo para leer archivos CSV y el csv-stringify módulo para clasificar los datos antes de escribirlos en un archivo usando Node.js.

     

    Etiquetas:

    Deja una respuesta

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