Ejercicio: Lectura de archivos y escritura en ellos
Ya casi hemos terminado de crear una aplicación Node.js maravillosa para Tailwind Traders. Hasta ahora, el código lee cualquier carpeta, busca todos los archivos .json
y crea un archivo totals.txt
en la carpeta salesTotals
.
En este ejercicio, se completa el proyecto; para ello, se leen los archivos .json files
, se suman los totales de todas las tiendas y se escribe el total general en el archivo salesTotals/totals.txt
.
Creación de un método para calcular totales de ventas
En la parte superior de index.js, justo debajo de la instrucción
require("path")
, cree una función que calcule el total de ventas. Este método debe tomar la matriz de rutas de acceso de archivo en la que pueda iterar.async function calculateSalesTotal(salesFiles) { let salesTotal = 0; // READ FILES LOOP return salesTotal; }
Dentro de esa función, reemplace
// READ FILES LOOP
por un bucle que:- (1) Itere la matriz
salesFiles
. - (2) Lea el archivo.
- (3) Analice el contenido como JSON.
- (4) Incremente la variable
salesTotal
con el valor del archivototal
.
async function calculateSalesTotal(salesFiles) { // Final sales total let salesTotal = 0; // (1) Tterates over the `salesFiles` array. for (file of salesFiles) { // (2) Reads the file. const fileContents = await fs.readFile(file) // (3) Parses the content as JSON. const data = JSON.parse(fileContents); // (4) Increments the `salesTotal` variable with the `total` value from the file. salesTotal += data.total; } return salesTotal; }
- (1) Itere la matriz
Llamada al método calculateSalesTotals
En la función
main
, modifique el código para:- (1) Agregar una llamada a la función
calculateSalesTotals
justo encima de la llamada afs.writeFile
. - (2) Modificar el bloque
fs.writeFile
para escribir el valor de la variablesalesTotal
en el archivo totals.txt.
async function main() { const salesDir = path.join(__dirname, "stores"); const salesTotalsDir = path.join(__dirname, "salesTotals"); try { await fs.mkdir(salesTotalsDir); } catch { console.log(`${salesTotalsDir} already exists.`); } const salesFiles = await findSalesFiles(salesDir); // (1) Add a call to the `calculateSalesTotals` function just above the `fs.writeFile` call. const salesTotal = await calculateSalesTotal(salesFiles); // (2) Modify the `fs.writeFile` block to write the value of the `salesTotal` variable to the *totals.txt* file. await fs.writeFile( path.join(salesTotalsDir, "totals.txt"), `${salesTotal}\r\n`, { flag: "a" } ); }
- (1) Agregar una llamada a la función
Ejecución del programa
Ejecute el programa desde el terminal.
node index.js
185933.76
Abra el archivo
./salesTotals/totals.txt
para ver el total de todas las ventas de los archivos sales.json y totals.json: 185933.76.Vuelva a ejecutar el programa desde el terminal.
node index.js
185933.76 185933.76
El archivo totals.txt ahora tiene una segunda línea. Cada vez que el programa se ejecute, los totales se volverán a sumar y se escribirá una nueva línea en el archivo.
¡Gran trabajo! Hemos escrito una herramienta inteligente, eficaz y útil que Tailwind Traders puede usar para procesar todas las ventas de sus tiendas cada noche. En la siguiente sección, revisaremos la información que hemos obtenido y algunas sugerencias que deberemos recordar.
¿Se ha bloqueado?
Si se ha bloqueado durante este ejercicio, aquí tiene el código completo de este proyecto.
const fs = require("fs").promises;
const path = require("path");
async function calculateSalesTotal(salesFiles) {
// Final sales total
let salesTotal = 0;
// (1) Tterates over the `salesFiles` array.
for (file of salesFiles) {
// (2) Reads the file.
const fileContents = await fs.readFile(file)
// (3) Parses the content as JSON.
const data = JSON.parse(fileContents);
// (4) Increments the `salesTotal` variable with the `total` value from the file.
salesTotal += data.total;
}
return salesTotal;
}
async function findSalesFiles(folderName) {
// (1) Add an array at the top, to hold the paths to all the sales files that the program finds.
let results = [];
// (2) Read the currentFolder with the `readdir` method.
const items = await fs.readdir(folderName, { withFileTypes: true });
// (3) Add a block to loop over each item returned from the `readdir` function using the asynchronous `for...of` loop.
for (const item of items) {
// (4) Add an `if` statement to determine if the item is a file or a directory.
if (item.isDirectory()) {
// (5) If the item is a directory, recursively call the function `findSalesFiles` again, passing in the path to the item.
const resultsReturned = await findSalesFiles(path.join(folderName, item.name));
results = results.concat(resultsReturned);
} else {
// (6) If it's not a directory, add a check to make sure the item name matches *sales.json*.
if (path.extname(item.name) === ".json")
results.push(`${folderName}/${item.name}`);
}
}
return results;
}
async function main() {
const salesDir = path.join(__dirname, "stores");
const salesTotalsDir = path.join(__dirname, "salesTotals");
// create the salesTotal directory if it doesn't exist
try {
await fs.mkdir(salesTotalsDir);
} catch {
console.log(`${salesTotalsDir} already exists.`);
}
// find paths to all the sales files
const salesFiles = await findSalesFiles(salesDir);
// read through each sales file to calculate the sales total
const salesTotal = await calculateSalesTotal(salesFiles);
// write the total to the "totals.json" file
await fs.writeFile(
path.join(salesTotalsDir, "totals.txt"),
`${salesTotal}\r\n`,
{ flag: "a" }
);
console.log(`Wrote sales totals to ${salesTotalsDir}`);
}
main();
¡Enhorabuena! Ha leído los archivos, analizado el JSON y escrito el total en un archivo. Ha completado el proyecto
Limpiar contenedor de desarrollo
Después de completar el proyecto, puede que desee limpiar el entorno de desarrollo o devolverlo a su estado típico.
La eliminación del entorno de GitHub Codespaces garantiza que pueda maximizar la cantidad de derechos de horas gratuitas por núcleo que obtiene para su cuenta.
Importante
Para obtener más información sobre los derechos de la cuenta de GitHub, consulte Almacenamiento y horas de núcleo incluidas mensualmente en GitHub Codespaces.
Inicie sesión en el panel de GitHub Codespaces (https://github.com/codespaces).
Busque los codespaces en ejecución actualmente procedentes del repositorio de GitHub
MicrosoftDocs/node-essentials
.Abra el menú contextual delcodespace y seleccione Eliminar.