En este ejercicio necesitamos crear un programa que lea un archivo sincrónicamente e imprima el número de líneas nuevas en el archivo a la consola, de forma similar al comando cat de comando a comando de conteo de palabras para contar el número de líneas en un archivo.

cat myFile.txt | wc -l

¿Queeeeeee?

Si no está familiarizado con estos comandos, el comando cat lee un archivo y el símbolo de la pipe( |) canaliza la salida del cat hacia el comando de conteo de palabras (wc). La opción de línea (-l) cuenta el número de líneas nuevas en el archivo.

Digamos que estos son los contenidos de myFile.txt.

this
file
has
six
new
lines

Si canalizamos la salida de cat myFile.txt al comando wc, obtenemos el resultado a continuación.

cat myFile.txt | wc -l
6

Afortunadamente, el nodo tiene un módulo de sistema de archivos para realizar tareas como ésta. Para usarlo, necesitamos requerir el módulo para que podamos usar sus métodos.

var fs = require(‘fs’)

Después de requerir el módulo fs, podemos usar el método readFileSync() para leer el contenido de un archivo. En este ejercicio, queremos leer un archivo que se pasa como tercer argumento en la línea de comandos. Recordemos que en el ejercicio de «baby steps» usamos la propiedad argv del objeto de proceso para sumar los valores pasados como argumento.

Podemos acceder al índice 2 de process.argv para leer los contenidos pasados como tercer argumento a la línea de comandos. El método readFileSync() devuelve el objeto buffer cuando la lectura ha finalizado.

Podemos convertir el contenido de ese objeto buffer a una cadena con el método toString(). Desde allí podemos usar el método split() para dividir la cadena en cada nueva línea (‘\n’) y obtener la longitud con .length. Debido a que nuestro archivo no tendrá un nuevo delimitador de línea al final de la última línea, terminaremos con una nueva línea adicional en nuestro recuento. Pero podemos restar uno de nuestro valor final para obtener la cuenta correcta. ¿Hay una manera mejor? Probablemente, pero usted tendrá que hacer el trabajo pesado para entenderlo.

Solución oficial

var fs = require(‘fs’)  
      
var contents = fs.readFileSync(process.argv[2])  
var lines = contents.toString().split(‘\n’).length – 1  
console.log(lines)

La solución se divide en varias líneas para facilitar la lectura, pero si queremos podemos meterla en una sola línea. Sin embargo, este formato puede causar náuseas, enfurecimiento o ambos. El uso es bajo su propio riesgo.

console.log(require(‘fs’).readFileSync(process.argv[2]).toString().split(‘\n’).length – 1)

Si ejecutamos cualquiera de estas soluciones desde la línea de comandos, obtendremos el resultado que sigue.

nodo ioSync.js myFile.txt
6

completado-1024x551 learnyounode Lección 3 – Mi Primer I/O!

Hecho!

Reader Interactions

Deja un comentario

Tu dirección de correo electrónico no será publicada.

Share This