Leyendo un archivo línea por línea en Node.js

Introducción

En Ciencias de la Computación, un archivo es un recurso utilizado para registrar datos de forma discreta en el dispositivo de almacenamiento de una computadora. Node.js no anula esto de ninguna manera y funciona con cualquier cosa que se considere un archivo en su sistema de archivos.
Los archivos y recursos de lectura tienen muchos usos:
  • Estadísticas, análisis e informes
  • Aprendizaje automático
  • Tratar con grandes archivos de texto o registros
A veces, estos archivos pueden ser absurdamente grandes, con gigabytes o terabytes almacenados, y leerlos en su totalidad es ineficiente.
El hecho de poder leer un archivo línea por línea nos permite buscar solo la información relevante y detener la búsqueda una vez que encontramos lo que estamos buscando. También nos permite dividir los datos en partes lógicas, como si el archivo tuviera el formato CSV.

Readline (desde v0.12 y en adelante)

Node.js tiene el módulo nativo para leer archivos que nos permite leer línea por línea. Fue agregado en 2015 y está pensado para leer desde cualquier Readablelínea una línea a la vez.
Este hecho lo convierte en una opción versátil, adecuada no solo para archivos sino también para entradas de línea de comandos como process.stdinLa documentación sobre el readlinemódulo se puede encontrar aquí .
Como readlinees un módulo nativo. No tiene que usar npmningún otro administrador de paquetes para agregarlo, solo require:
const readline = require('readline');  
y eres bueno para ir!
Como el readlinemétodo debe suministrarse con un flujo, primero debemos crearlo utilizando otro módulo nativo fs:
const fs = require('fs');  
El siguiente paso es crear el objeto que se leerá de la secuencia usando la createInterface()función:
const readInterface = readline.createInterface({  
    input: fs.createReadStream('/path/to/file'),
    output: process.stdout,
    console: false
});
Asegúrese de sustituir /path/to/filecon la ruta real a un archivo en su sistema de archivos.
Una vez realizada la preparación, la lectura de un archivo línea por línea y la impresión de su contenido en la consola se puede realizar de la siguiente manera:
readInterface.on('line', function(line) {  
    console.log(line);
});
Básicamente, estamos diciendo que siempre lineque ocurra un evento en el readInterfacedebe llamar a nuestra función y pasarle el contenido leído de la transmisión. En nuestro caso, no queremos complicar demasiado las cosas y simplemente imprimirlas en la consola.

Lector de linea

Después de una explicación detallada de cómo podría leer un archivo línea por línea usando el módulo Node.js nativo, echemos un vistazo a una versión más corta usando el módulo de lector de línea decódigo abierto de npm.
Como es un módulo no nativo, debemos asegurarnos de haber inicializado el proyecto npm de manera adecuada npm inity luego instalarlo:
$ npm install --save line-reader
Esto instalará la dependencia y la agregará al package.jsonarchivo.
Una vez hecho esto, leer un archivo línea por línea es similar al ejemplo anterior solo sin crear uno readInterfaceen el medio:
const lineReader = require('line-reader');

lineReader.eachLine('/path/to/file', function(line) {  
    console.log(line);
});
Una característica bastante útil aquí es dejar de leer cuando alguna condición se vuelve verdadera. Esto se logra simplemente regresando falsede la función de devolución de llamada.
Por ejemplo, podríamos leer un archivo línea por línea hasta que encontremos una línea que contenga la palabra "DETENER":
lineReader.eachLine('path/to/file', function(line) {  
    console.log(line);
    if (line.includes('STOP') {
        return false; // stop reading
    }
});
Hay un enfoque ligeramente diferente, que utiliza dos devoluciones de llamada y sintaxis anidadas que pueden parecer más naturales para los desarrolladores de Java:
lineReader.open('/path/to/file', function(reader) {  
    if (reader.hasNextLine()) {
        reader.nextLine(function(line) {
            console.log(line);
        });
    }
});
Aquí, estamos usando la open()función, que no nos proporciona las líneas de un archivo al instante, sino que nos da una readerTiene su propio conjunto de funciones hasNextLine()nextLine()nos permite tener un poco más de control sobre el proceso de lectura de un archivo línea por línea en Node.js.

N-readlines

El módulo npm proporciona una sintaxis diferente n-readlines:
Vamos a instalarlo:
$ npm install --save n-readlines
Y lo requiere:
const lineByLine = require('n-readlines');  
Para poder leer desde un archivo, debemos crear un nuevo objeto, proporcionando una ruta a nuestro archivo como un argumento:
const liner = new lineByLine('/path/to/file');  
La obtención de las líneas del archivo se realiza llamando a la nextfunción:
let line;

while (line = liner.next()) {  
    console.log(line);
}
Una función interesante del n-readlinesmódulo es reset()Restablece el puntero e inicia el proceso de lectura desde el principio del archivo.
Nota : Funciona solo si no se llega al final.

Errores comunes

Un error común al leer un archivo línea por línea en Node.js es leer todo el archivo en la memoria y luego dividir su contenido por saltos de línea.
Aquí hay un ejemplo incorrecto que podría sobrecargar su sistema si le proporciona un archivo lo suficientemente grande:
require('fs').readFileSync('/path/to/file', 'utf-8').split(/\r?\n/).forEach(function(line) {  
    console.log(line);
});
A primera vista, parece que la salida es la misma tanto para este enfoque como para las anteriores, y de hecho, funciona bien para archivos pequeños. Pero adelante e intenta trabajar con uno grande. Definitivamente no es algo que quieras ver en tu sistema de producción.

Conclusión

Hay varias formas de leer un archivo línea por línea en Node.js, y la selección del enfoque apropiado es totalmente una decisión del programador.
Debe pensar en el tamaño de los archivos que planea procesar, los requisitos de rendimiento, el estilo del código y los módulos que ya están en el proyecto. Asegúrate de probar en algunos casos de esquina como archivos grandes, vacíos o inexistentes, y estarás bien con cualquiera de los ejemplos proporcionados.

Acerca de: Programator

Somos Instinto Programador

0 comentarios:

Publicar un comentario

Dejanos tu comentario para seguir mejorando!

Con tecnología de Blogger.