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

L

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.

 

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 y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con tus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. 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