--- title: Traitement et conversion de données avec D3js tags: data, d3js, data robots: noindex, nofollow author: Julien Noyer --- # Traitement et conversion de données avec D3js *Principe de base de gestion de l'information en Javascript* ![](https://i.imgur.com/BxJdR2E.png) > &copy; [Julien Noyer](https://www.linkedin.com/in/julien-n-21219b28/)- All rights reserved for educational purposes only --- ## Introduction La bibliothèque [**D3js**](https://d3js.org) est principalement utiliser pour faire de la Data visualisation mais il contient également des outils très intéressants qui permettent de traiter et de convertir des données dans différents formats. Dans le cadre de ce document nous allons utiliser [**D3js**](https://d3js.org) pour convertir des données du format [CSV](https://fr.wikipedia.org/wiki/Comma-separated_valuesV) au format [JSON](https://www.json.org/json-en.html) afin de préparer la suite des exercices à réaliser lors des futures séquences. ## Initialiser une page web avec [**D3js**](https://d3js.org) [**D3js**](https://d3js.org) est une initialement un bibliothèque à la fois [Front End](https://fr.wikipedia.org/wiki/Développement_web_frontal) et [Back End](https://fr.wikipedia.org/wiki/Backend), dans le cadre de ce document nous allons l'utiliser sur une page HTML que nous configurons de cette manière : ```htmlmixed= <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>D3js : parse CSV to JSON</title> <script src="https://d3js.org/d3.v5.min.js"></script> </head> <body> <script> // Ajouter le script sous cette ligne </script> </body> </html> ``` > Nous importons le [CDN](https://fr.wikipedia.org/wiki/Réseau_de_diffusion_de_contenu) de [D3js](https://d3js.org) dans la balise `<head>`? ## Convertir un fichier CSV en JSON La méthode `.csv()` de [D3js](https://d3js.org) permet de charger un fichier [CSV](https://fr.wikipedia.org/wiki/Comma-separated_valuesV)? Nous allons commencer par créer un fichier `cities.csv` que nous placerons dans un dossier `data` à la racine de la page web. Le contenu de ce fichier est le suivant : ```csv city,state,population,land area seattle,WA,652405,83.9 new york,NY,8405837,302.6 boston,MA,645966,48.3 ``` Puis nous ajoutons le code suivant dans la balise `<script>` de la page web : ```js // Convertir le fichier CSV en JSON d3.csv('./data/cities.csv') .then( data => { // Afficher le résultat dans la console console.log(data); }) .catch( err => { console.error(err); }); ``` > Il est possible de convertir des fichiers [TSV](https://fr.wikipedia.org/wiki/Tabulation-separated_values) avec la fonction `.tsv()`. Le principe de [D3js](https://d3js.org) étant de traiter les données pour quelles soient traitées en Javascript, le format [JSON](https://www.json.org/json-en.html) est celui qui est renvoyer par les fonctions de conversion. Dans le cadre de données `cities.csv` qui contient de valeurs de type chaine de caractères, le fait de les convertir en [JSON](https://www.json.org/json-en.html) va nous permettre de boucler sur le résultat pour typer les valeurs de la façon suivante : ```javascript= // Créer un tableau vide let convertedData = []; // Boucle FOR...OF sur la collection de données for( const item of data ){ // ES6 Conversion en INT. convertedData.push({ city: item.city, state: item.state, population: +item.population; // eg. parseInt() "land area": +item['land area']; // eg. parseFloat() }) }; // Afficher les données converties dans la console console.log(convertedData); ``` > Le code ci-dessus est dans la fonction `.then()` (dite de `callback`). ## Convertir plusieurs fichiers en JSON Il est possible d'utiliser un tableau de [promesses](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Promise) pour charger plusieurs fichiers différents, nous allons donc créer un fichier [DSV](https://fr.wikipedia.org/wiki/Delimiter-separated_values) nommé `animals.txt` contenant les données suivantes : ```dsv name|avg_weight|state tiger|260|WA hippo|3400|NY komodo dragon|150|MA ``` Puis nous ajoutons le code suivant à la fin du script précédemment créé : ```javascript= // Mettre en place un tableau de promesses Promise.all([ d3.csv("/data/cities.csv"), d3.dsv("|", "/data/animals.txt") ]).then(function(data) { // Créer des constantes avec le résultat const cities = data[0][0] const animals = data[1][0] // Créer un tableau vide let combinatedData = []; // Boucle FOR...OF sur la collection de cities for( const city of cities ){ // ES6 Conversion en INT. let newCity = { city: item.city, state: item.state, population: +item.population; // eg. parseInt() "land area": +item['land area']; // eg. parseFloat() animales: []; }; // Boucle FOR...OF sur la collection de animals for( const animal of animals ){ // Combiner les collections de données if( animal.state === city.sate){ // ES6 Conversion en INT. newCity.animales.push({ name: animal.name, weight: +animal.avg_weight; // eg. parseInt() }) }; }; // Ajouter la ville dans le tableau combinatedData.push(newCity); }; // Afficher les données combinées dans la console console.log(combinatedData); }); ``` > L'[algorithme de trie](https://fr.wikipedia.org/wiki/Algorithme_de_tri) utilisé est le [tri à bulle](https://fr.wikipedia.org/wiki/Tri_à_bulles). ## Synthèse des données avec [**D3js**](https://d3js.org) [**D3js**](https://d3js.org) dispose d'un certain nombre d'outils pour synthétiser des collections de données. Nous allons garder le chargement du fichier `cities.csv` puis nous allons utiliser différentes méthodes : ```javascript= // Convertir le fichier CSV en JSON d3.csv('./data/cities.csv') .then( data => { // Retourner la valeur minimale : .min() var minPopulation = d3.min(data, function(item) { return item.population; }); console.log(minPopulation); // Retourner la valeur maximale : .max() var maxPopulation = d3.max(data, function(item) { return item.population; }); console.log(maxPopulation); // Retourner la valeur minimale et maximale : .extent() var population = d3.extent(data, function(item) { return item.population; }); console.log(population); }) .catch( err => { console.error(err); }); ``` > Il existe une grande quantité de méthodes dont la [documentation est ici](https://github.com/d3/d3-array) ## Gestion du temps avec [**D3js**](https://d3js.org) Le temps est une chose délicate en programmation qui semble simple, mais qui s'avère généralement ne pas l'être. Les fonctions d'analyse temporelle et d'intervalle intégrées de [**D3js**](https://d3js.org) permettent de manipuler les données temporelles de manière plus simplifiée. La fonction **d3.timeParse** fournit un moyen de faire une analyse temporelle, nous allons utiliser cette fonction pour créer un analyseur de chaîne, puis utilisez l'analyseur pour convertir réellement la chaîne. ```javascript= // Définition d'un objet let expense = {"name":"jim","amount":34,"date":"11/12/2015"}; // Utilisation de la fonction timeParse() pour créer une fonction de convertion let parser = d3.timeParse("%m/%d/%Y"); // Convertion de la prorpiété "data" de l'objet "expense" expense.date = parser(expense.date); // Affichage du résultat dans la console console.log(expense); ``` > La valeur retournée de la fonction **d3.timeParse** est elle-même une fonction, nous pouvons donc simplement passer notre chaîne de date directement à cette fonction. Voici quelques analyseurs de temps supplémentaires pour montrer les capacités de l'analyse de D3. Notez à nouveau que nous créons une fonction **d3.timeParse** puis nous transmettons une chaîne à analyser, cette fois sur une seule ligne : ```javascript= // Création d'une variable de date let date = d3.timeParse("%A, %B %-d, %Y")("Wednesday, November 12, 2014"); // Affichage du résultat dans la console console.log(date); // Création d'une variable de temps let time = d3.timeParse("%I:%M%p")("12:34pm"); // Affichage du résultat dans la console console.log(time); // Création d'une variable de date et de temps let dateAndTime = d3.timeParse("%x %X")("1/2/2014 8:22:05 AM"); // Affichage du résultat dans la console console.log(dateAndTime); ``` [**Moment.js**](https://momentjs.com) est une autre bibliothèque JavaScript qui pourrait être mieux adaptée à vos besoins, si vous effectuez beaucoup de manipulations de temps. Sa syntaxe et ses capacités semblent un peu plus intuitives pour certaines manipulations temporelles. --- ## Ressources ![](https://i.imgur.com/eAySYs0.png) > Index des liens vers les sujets traités dans ce syllabus : - **D3js** https://d3js.org - **Format CSV** https://fr.wikipedia.org/wiki/Comma-separated_valuesV - **Format DSV** https://fr.wikipedia.org/wiki/Delimiter-separated_values - **Format JSON** https://www.json.org/json-en.html - **Dévelopement Front End** https://fr.wikipedia.org/wiki/Développement_web_frontal - **Dévelopement Back End** https://fr.wikipedia.org/wiki/Backend - **Content Delivery Network** https://fr.wikipedia.org/wiki/Réseau_de_diffusion_de_contenu - **Les promesses en Javascript** https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Promise - **Algorithme de trie** https://fr.wikipedia.org/wiki/Algorithme_de_tri - **Tri à bulle** https://fr.wikipedia.org/wiki/Tri_à_bulles - **Moment.js** https://momentjs.com