Lectura y escritura en archivos

Completado

La aplicación Tailwind Traders debe leer los datos de ventas de cada tienda, calcular el total y, a continuación, escribir el total de todos los archivos de ventas de la tienda individuales en un archivo nuevo.

Lectura de datos de archivos con fs.readFile

Los archivos se leen a través del método readFile del módulo fs.

await fs.readFile("stores/201/sales.json");

El objeto devuelto del método readFile es un objeto Buffer. Tiene el contenido del archivo en formato binario. Por ejemplo, supongamos que tiene el siguiente archivo llamado sales.json con el contenido siguiente.

{
  "total": 22385.32
}

Al cerrar sesión, el valor devuelto del método readFile proporcionará el valor Buffer.

<Buffer 7b 0a 20 20 22 74 6f 74 61 6c 22 3a 20 32 32 33 38 35 2e 33 32 0a 7d>

Ese resultado no resulta útil. Posiblemente se haya leído el archivo, pero es cierto que se pueden "leer" estos datos. No pasa nada. JavaScript puede convertir un valor Buffer en un valor de cadena que puede usar para calcular el total. Para ello, invoque el objeto String y pase el búfer.

const bufferData = await fs.readFile("stores/201/sales.json");
console.log(String(bufferData));

La salida es la siguiente:

{
  "total": 22385.32
}

Análisis de datos con JSON.parse

Estos datos en su formato de cadena no nos aportan demasiado. Son solo caracteres, si bien ahora tienen un formato que se puede leer. Quiere tener la capacidad de convertir esta cadena en datos accesibles mediante programación (conocidos como datos de análisis).

JavaScript incluye un analizador integrado de archivos JSON. No es necesario incluir nada para usarlo, solo el objeto JSON. Como ventaja extra, tampoco es necesario convertir un valor Buffer en una cadena antes de analizarlo. De eso se encarga el método JSON.parse. JSON.parse es un método común que se usará con frecuencia en el desarrollo web cuando una API reciba datos (como cadenas) a través de Internet, que luego deben convertirse en objetos JSON.

// read the file as string
const fileContents = await fs.readFile("stores/201/sales.json");

// turn string into JSON
const data = JSON.parse(fileContents);

// access the value by the property key `total`
console.log(data.total);

La salida es la siguiente:

22385.32

Sugerencia

Los archivos presentan una gran variedad de formatos. Los archivos JSON son los que más nos conviene usar debido a su compatibilidad integrada en el lenguaje, pero se puede encontrar con archivos .csv, de ancho fijo o con cualquier otro formato. En tal caso, lo mejor es buscar en npmjs.org un analizador acorde a ese tipo de archivo.

Escritura de datos en archivos con fs.writeFile

Ha obtenido información sobre cómo escribir archivos en el ejercicio anterior, solo que escribimos en uno vacío. Para escribir datos en un archivo, deberemos usar el mismo método writeFile, pero pasando los datos que queremos escribir como tercer parámetro.

// read the file as string
const fileContents = await fs.readFile("stores/201/sales.json");

// turn string into JSON
const data = JSON.parse(fileContents);

// file name is totals.txt
const filePath = path.join("salesTotals","totals.txt");

// write the total to the "totals.json" file
await fs.writeFile(filePath, data.total);

El contenido del archivo totals.txt es:

22385.32

Anexar datos a archivos con fs.writeFile

En el ejemplo anterior, el archivo se sobrescribe cada vez que se escribe en él. A veces, lo que quiere es anexar datos al archivo en lugar de reemplazarlos por completo. Para ello, se puede pasar una marca al método writeFile. La marca está establecida de forma predeterminada en w, que significa reemplazar el archivo. Para anexar datos al archivo en vez de reemplazarlo, pasaremos la marca a, que significa anexar.

// read the file as string
const fileContents = await fs.readFile("stores/201/sales.json");

// turn string into JSON
const data = JSON.parse(fileContents);

// file name is totals.txt
const filePath = path.join("salesTotals","totals.txt");

// write the total to the "totals.json" file
await fs.writeFile(filePath, `${data.total}\r\n`, {flag: "a"});

El contenido del archivo totals.txt es:

22385.32

Sugerencia

En el código de ejemplo anterior, \r\n indica a JavaScript que ponga el valor en su propia línea. Si no se pasara este valor (conocido como avance de línea de retorno de carro), se obtendrían todos los números en la misma línea, apelotonados.

En el ejercicio siguiente, finalizaremos el proyecto de totales de ventas de Tailwind Traders mediante la lectura de todos los archivos de ventas y la escritura del total general en un archivo .txt. Posteriormente, el sistema comercial de la empresa puede procesar el archivo.