Exercice - Lire et écrire dans des fichiers
Vous avez presque fini de créer un magnifique programme Node.js pour Tailwind Traders. Jusqu’à présent, votre code lit n’importe quel dossier, recherche tous les fichiers .json
et crée un fichier totals.txt
dans le dossier salesTotals
.
Dans cet exercice, vous terminez le projet en lisant le .json files
, en ajoutant les totaux du magasin et en écrivant le total général dans le fichier salesTotals/totals.txt
.
Créer une méthode pour calculer les totaux des ventes
En haut du fichier index.js, juste en dessous de l’instruction
require("path")
, créez une fonction qui calcule le total des ventes. Cette méthode doit prendre le tableau de chemins de fichiers dans lequel elle peut itérer.async function calculateSalesTotal(salesFiles) { let salesTotal = 0; // READ FILES LOOP return salesTotal; }
Au sein de cette fonction, remplacez
// READ FILES LOOP
par une boucle qui effectue ce qui suit :- (1) Itère sur le tableau
salesFiles
. - (2) Lit le fichier.
- (3) Analyse le contenu en tant que JSON.
- (4) Incrémente la variable
salesTotal
avec la valeurtotal
du fichier.
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) Itère sur le tableau
Appeler la méthode calculateSalesTotals
Dans la fonction
main
, modifiez le code pour :- (1) Ajouter un appel à la fonction
calculateSalesTotals
juste au-dessus de l’appelfs.writeFile
. - (2) Modifier le bloc
fs.writeFile
pour écrire la valeur de la variablesalesTotal
dans le fichier 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) Ajouter un appel à la fonction
Exécuter le programme
Exécutez le programme à partir du terminal.
node index.js
185933.76
Ouvrez le fichier
./salesTotals/totals.txt
pour afficher le total de toutes les ventes à partir des fichiers sales.json et totals.json : 185933.76.Réexécutez le programme à partir du terminal.
node index.js
185933.76 185933.76
Le fichier totals.txt contient maintenant une deuxième ligne. Chaque fois que vous exécutez le programme, les totaux sont à nouveau ajoutés et une nouvelle ligne est écrite dans le fichier.
Beau travail ! Vous avez écrit un outil intelligent, robuste et pratique que Tailwind Traders peut utiliser pour traiter toutes les ventes de ses magasins chaque nuit. Dans la section suivante, nous allons passer en revue ce que vous avez appris ainsi que quelques conseils à garder en tête.
Vous êtes bloqué ?
Si vous êtes bloqué pendant cet exercice, voici le code complet de ce projet.
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();
Félicitations ! Vous avez lu les fichiers, analysé le JSON et écrit le total dans un fichier. Vous avez terminé le projet !
Nettoyer le conteneur de développement
Une fois le projet terminé, vous souhaiterez peut-être nettoyer votre environnement de développement ou le ramener à son état normal.
La suppression de l’environnement GitHub Codespaces vous permet d’optimiser le nombre d’heures gratuites par cœur que vous obtenez pour votre compte.
Important
Pour plus d’informations sur les droits de votre compte GitHub, consultez GitHub Codespaces mensuel inclus stockage et heures principales.
Connectez-vous au tableau de bord GitHub Codespaces (https://github.com/codespaces).
Localisez vos codespaces en cours d’exécution provenant du
MicrosoftDocs/node-essentials
dépôt GitHub.Ouvrez le menu contextuel du codespace et sélectionnez Supprimer.