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 *