Lire et écrire dans des fichiers

Effectué

L’application Tailwind Traders doit lire les données de ventes de chaque magasin, calculer le total, puis écrire le total de tous les fichiers de ventes des magasins individuels dans un nouveau fichier.

Lire les données de fichiers avec fs.readFile

Les fichiers sont lus en utilisant la méthode readFile du module fs.

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

L’objet retourné par la méthode readFile est un objet Buffer. Il présente le contenu du fichier au format binaire. Par exemple, supposons que vous avez un fichier appelé sales.json avec le contenu suivant.

{
  "total": 22385.32
}

La sortie de la valeur retournée par la méthode readFile vous donnerait la valeur 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>

Ce résultat n’est pas utile. Le fichier a peut-être été lu, mais ces données ne sont pas « lisibles ». Ce n’est pas grave, cela dit. JavaScript peut convertir une valeur Buffer en valeur de chaîne que vous pouvez utiliser pour calculer le total. Pour cela, appelez l’objet String et passez la mémoire tampon.

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

La sortie est la suivante :

{
  "total": 22385.32
}

Analyser des données avec JSON.parse

Ces données dans leur format de chaîne n’ont rien d’extraordinaire. Ce sont juste des caractères, qui sont maintenant présentés dans un format lisible. Vous souhaitez pouvoir transformer cette chaîne en données accessibles par programmation (appelées données d’analyse).

JavaScript comprend un analyseur intégré pour les fichiers JSON. Vous n’avez pas besoin d’inclure quoi que ce soit pour l’utiliser. Utilisez juste l’objet JSON. En prime, vous n’avez pas besoin de convertir une valeur Buffer en chaîne avant de l’analyser. La méthode JSON.parse peut le faire. JSON.parse est une méthode couramment employée dans le développement web lorsqu’une API reçoit via Internet des données sous forme de chaînes qui doivent ensuite être transformées en objets 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 sortie est la suivante :

22385.32

Conseil

Les fichiers se présentent dans des formats divers. Les fichiers JSON sont les plus intéressants à utiliser en raison de leur prise en charge intégrée dans le langage. Toutefois, vous pouvez rencontrer des fichiers au format .csv, de largeur fixe ou d’un autre format. Dans ce cas, il est préférable de rechercher un analyseur pour ce type de fichier dans npmjs.org.

Écrire des données dans des fichiers avec fs.writeFile

Vous avez appris à écrire des fichiers dans l’exercice précédent. C’est juste que vous en avez écrit un vide. Pour écrire des données dans un fichier, utilisez la même méthode writeFile, mais passez les données que vous voulez écrire comme troisième paramètre.

// 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);

Le fichier totals.txt présente le contenu suivant :

22385.32

Ajouter des données à des fichiers avec fs.writeFile

Dans l’exemple précédent, le fichier est remplacé chaque fois que vous écrivez dedans. Parfois, vous souhaitez ajouter des données au fichier au lieu de le remplacer entièrement. Vous pouvez ajouter des données en transmettant un indicateur à la méthode writeFile. Par défaut, l’indicateur est défini sur w, ce qui signifie remplacer le fichier. Pour faire un ajout au fichier, passez l’indicateur a, ce qui signifie ajouter.

// 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"});

Le fichier totals.txt présente le contenu suivant :

22385.32

Conseil

Dans l’exemple de code précédent, \r\n indique à JavaScript de placer la valeur sur sa propre ligne. Si vous n’aviez pas passé cette valeur (appelée saut de ligne de retour chariot), vous verriez tous les chiffres serrés sur la même ligne.

Dans l’exercice suivant, vous allez terminer le projet des totaux de ventes pour Tailwind Traders en lisant tous les fichiers de ventes et en écrivant le total général dans un fichier .txt. Ce fichier pourra ensuite être traité par le système commercial de l’entreprise.