Leer un archivo l铆nea por l铆nea en Node.js

    Introducci贸n

    En Ciencias de la Computaci贸n, un archivo es un recurso que se utiliza para registrar datos discretamente 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.

    La lectura de archivos y recursos tiene muchos usos:

    • Estad铆sticas, an谩lisis e informes
    • Machine Learning
    • Manejo de registros o archivos de texto grandes

    A veces, estos archivos pueden ser absurdamente grandes, con gigabytes o terabytes almacenados, y leerlos en su totalidad es ineficaz.

    Poder leer un archivo l铆nea por l铆nea nos da la capacidad de buscar solo la informaci贸n relevante y detener la b煤squeda una vez que hayamos encontrado lo que estamos buscando. Tambi茅n nos permite dividir los datos en partes l贸gicas, como si el archivo tuviera formato CSV.

    Readline (desde v0.12 en adelante)

    Node.js tiene el m贸dulo nativo para leer archivos que nos permite leer l铆nea por l铆nea. Se agreg贸 en 2015 y est谩 destinado a leer de cualquier Readable transmitir una l铆nea a la vez.

    Este hecho la convierte en una opci贸n vers谩til, adecuada no solo para archivos sino incluso para entradas de l铆nea de comando como process.stdin. La documentaci贸n sobre readline se pudo encontrar el m贸dulo Aqu铆.

    Como readline es un m贸dulo nativo. No tienes que usar npm a cualquier otro administrador de paquetes para agregarlo, solo require:

    const readline = require('readline');
    

    隆y listo!

    Como el readline El m茅todo debe ser provisto con una secuencia, primero tenemos que crearlo usando otro m贸dulo nativo – fs:

    const fs = require('fs');
    

    El siguiente paso es crear el objeto que leer谩 de la secuencia usando createInterface() funci贸n:

    const readInterface = readline.createInterface({
        input: fs.createReadStream('/path/to/file'),
        output: process.stdout,
        console: false
    });
    

    Aseg煤rate de sustituir /path/to/file con 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 e imprimir su contenido en la consola se puede realizar de la siguiente manera:

    readInterface.on('line', function(line) {
        console.log(line);
    });
    

    Aqu铆 esencialmente estamos diciendo que siempre que el line evento ocurre en el readInterface deber铆a llamar a nuestra funci贸n y pasarle el contenido le铆do de la secuencia. En nuestro caso, no queremos complicar demasiado las cosas y simplemente imprimirlo en la consola.

    Lector de l铆nea

    Despu茅s de una explicaci贸n detallada de c贸mo puede leer un archivo l铆nea por l铆nea usando el m贸dulo nativo Node.js, echemos un vistazo a una versi贸n m谩s corta usando el c贸digo abierto lector de l铆nea m贸dulo de npm.

    Como es un m贸dulo no nativo, debemos asegurarnos de haber inicializado el proyecto npm de manera adecuada con npm init y luego instalarlo:

    $ npm install --save line-reader
    

    Esto instalar谩 la dependencia y la agregar谩 al package.json archivo.

    Una vez hecho esto, leer un archivo l铆nea por l铆nea es similar al ejemplo anterior solo sin crear una readInterface en 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 false desde 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 anidadas y una sintaxis que puede parecer m谩s natural 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 el open() funci贸n, que no nos proporciona las l铆neas de un archivo al instante, sino que nos da una reader. Tiene su propio conjunto de funciones como hasNextLine() y nextLine() lo que 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 requieres:

    const lineByLine = require('n-readlines');
    

    Para poder leer desde un archivo, debemos crear un nuevo objeto, proporcionando una ruta a nuestro archivo como argumento:

    const liner = new lineByLine('/path/to/file');
    

    Obtener las l铆neas del archivo se realiza llamando al next funci贸n:

    let line;
     
    while (line = liner.next()) {
        console.log(line);
    }
    

    Una funci贸n interesante del n-readlines el m贸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 el archivo completo 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 el resultado es el mismo para este enfoque y para los anteriores y, de hecho, funciona bien para archivos peque帽os. Pero adelante, intente trabajar con uno grande. Definitivamente no es algo que quiera ver en su 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 completamente 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煤rese de probar en algunos casos de esquina, como archivos enormes, vac铆os o inexistentes, y estar谩 listo para usar cualquiera de los ejemplos proporcionados.

     

    Etiquetas:

    Deja una respuesta

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