Objectifs : dans ce TP il s'agit d'expérimenter

Avant toute chose, créez un dossier TP11 dans le dossier PLAI dans lequel vous avez rangé les différents travaux réalisés lors des séances de TP précédentes. Positionnez vous ensuite dans ce dossier que vous ouvrirez avec VSCode.

1. Tronquer du texte

Ecrire une fonction \(truncate(str, maxlength, endstr)\) qui retourne

  • la chaîne \(str\) inchangée si \(str.length <= maxlenght\)

  • une chaîne de longueur \(maxlength\) correspondant à la chaîne \(str\) coupée et concaténée avec la chaîne \(endstr\) si \(str.length > maxlenght\)

Pour tester votre fonction exécutez les instructions suivantes

console.log(truncate("0123456789", 14, "...."));
console.log(truncate("0123456789", 7, "...."));
console.log(truncate("0123456789", 7));

Les résultats attendus sont les suivants

λ node truncate.js 
0123456789       // la longueur de la chaîne est <= 14 , elle n'est pas tronquée
012....          // la longueur de la chaîne est > 7, elle est coupée et concaténée avec "...." afin d'avoir une longueur de 7
0123...          // la longueur de la chaîne est > 7, elle est coupée et concaténée avec "..." (valeur par defaut)
                 // afin d'avoir une longueur de 7

La méthode splice de String vous aidera à faire le job.

2. Traiter des données CSV

Le format CSV (Comma-separated values), est un format textuel représentant des données tabulaires sous forme de valeurs séparées par des virgules. Il sert de format d'export pour des tableurs (Excel de MSOffice, calc de Libre Office...) et de par sa relative facilié d'utilisation est largement utilisé comme format d'échange de données (pour en savoir plus voir Wikipedia (fr) ou Wikipedia (en) ).

Question 1: Ecrivez une fonction \(csvToNumberArray(str)\) qui permet de récupérer dans un tableau les valeurs numérique contenues dans une ligne d'un fichier CSV (Comma Separated Values).

  • \(str\) est la chaine de caractères correspondant à une ligne d'un fichier CSV. Le caractère ',' sépare les valeurs qui sont des nombres (entiers ou décimaux).

  • la fonction retourne un tableau de nombres contenant dans l'ordre les différentes valeurs numériques contenues dans la chaîne \(str\). Il se peut que dans le tableau original une valeur soit absente, dans ce cas dans le fichier csv seule une virgule apparaît. En cas d'absence de valeur le tableau résultat contiendra la valeur \(NaN\).

Ci dessous un exemple de données et du résultat attendu.

λ node csv1
la chaine à traiter
 123,   -11,12,  34.67,, 1257, 0.78,  14, 17, -345.2 

Le tableau résultat  // on l'affiche avec la méthode console.table(...)

┌─────────┬────────┐
│ (index) │ Values │
├─────────┼────────┤
│    0    │  123   │
│    1    │  -11   │
│    2    │   12   │
│    3    │ 34.67  │
│    4    │  NaN   │   // ,, --> absence de valeur
│    5    │  1257  │
│    6    │  0.78  │
│    7    │   14   │
│    8    │   17   │
│    9    │ -345.2 │
└─────────┴────────┘

La méthode split de String vous aidera à découper la chaîne \(str\) autour des ",".

Question 2 : Ecrivez une fonction \(csvToStringArray1(str)\) qui permet de récupérer dans un tableau les valeurs textuelles contenues dans une ligne d'un fichier CSV (Comma Separated Values).

  • \(str\) est la chaine de caractères correspondant à une ligne d'un fichier CSV. Le caractère "," sépare les valeurs qui sont considérées comme des chaines de caractères.

  • la fonction retourne un tableau de chaînes (\(string\)) contenant dans l'ordre les différentes valeurs contenues dans \(str\) (en supprimant les espaces en tête et en fin des valeurs). Il se peut que dans le tableau original une valeur soit absente, dans ce cas dans le fichier csv seule une virgule apparaît. En cas d'absence de valeur le tableau résultat contiendra la valeur '' (correspondant à une chaîne vide).

Ci dessous un exemple de données et du résultat attendu.

λ ncsv2.js
la chaine à traiter
'  valeur1 ,  valeur2 ,   valeur3 composée de plusieurs mots,, valeur4,valeur5,  dernière valeur     '

Le tableau résultat

┌─────────┬──────────────────────────────────────┐
│ (index) │                Values                │
├─────────┼──────────────────────────────────────┤
│    0    │              'valeur1'               │
│    1    │              'valeur2'               │
│    2    │ 'valeur3 composée de plusieurs mots' │
│    3    │                  ''                  │   //  ,, absence de valeur --> chaîne vide
│    4    │              'valeur4'               │
│    5    │              'valeur5'               │
│    6    │          'dernière valeur'           │
└─────────┴──────────────────────────────────────┘

La méthode trim de String vous aidera à supprimer les espaces en début et fin de chaîne.

Question 3 : attention cet exercice est d'une difficulté algorithmique supérieure aux exercices précédents, ne le faite qu'après avoir fait les exercices sur les expressions régulières.

Dans le format CSV les champs textes peuvent également être délimités par des guillemets '"'. En particulier les '"' sont utilisés lorsque le champ texte contient le caractère ',' utilisé comme séparateur de valeurs.

Ecrivez une fonction \(csvToStringArray2(str)\) qui permet de récupérer dans un tableau les valeurs textuelles contenues dans une ligne d'un fichier CSV (Comma Separated Values) en traitant le cas particulier des valeurs entre '"'.

Ci dessous un exemple de données et du résultat attendu.

λ node csv3.js
la chaine à traiter
'"  Valeur entre quotes "   , Valeur1 , Valeur2,  Valeur avec plusieurs mots,  "   valeur contenant , et , "   
  ,  autre valeur sans quotes  , "valeur entre quotes suivie d'une valeur vide",, "une dernière après des ,,"   '

Le tableau résultat

┌─────────┬────────────────────────────────────────────────┐
│ (index) │                     Values                     │
├─────────┼────────────────────────────────────────────────┤
│    0    │             'Valeur entre quotes'              │
│    1    │                   'Valeur1'                    │
│    2    │                   'Valeur2'                    │
│    3    │          'Valeur avec plusieurs mots'          │
│    4    │           'valeur contenant , et ,'            │
│    5    │           'autre valeur sans quotes'           │
│    6    │ "valeur entre quotes suivie d'une valeur vide" │
│    7    │                       ''                       │    //  ,, absence de valeur --> chaîne vide
│    8    │          'une dernière après des ,,'           │
└─────────┴────────────────────────────────────────────────┘

3. Expressions régulières

"En informatique, une expression régulière (ou expression rationnelle ou expression normale ou motif), est une chaîne de caractères, qui décrit, selon une syntaxe précise, un ensemble de chaînes de caractères possibles (Wikipedia)."

3.1 utiliser un exepression régulière pour découper une chaîne

Question 1 : Utilisez https://regex101.com/ pour mettre au points une expression régulière qui permet d'isoler les virgules et espaces dans un chaîne correspondant à une suite de valeurs au format CSV (vous vous contenterez de valeurs sans caractères '"', c'est à dire que chaque caractère '"' joue le rôle de séparateur de valeurs.

Tester votre expression sur la chaîne suivante (pensez à supprimer les " en début et fin mais conservez les espaces)

"  valeur1 ,  valeur2 ,   valeur3 composée de plusieurs mots,, valeur4,valeur5,  dernière valeur  "

Le résultat attendu est le suivant :

Question 2 : la méthode \(split\) des chaînes de caractères peut prendre en paramètre soit une chaîne de caractères soit une expression régulière. Utilisez l'expression régulière mise au point dans la question précédente pour simplifier votre fonction \(csvToStringArray1(str)\) écrite pour la question 2 de l'exercice 2.

Le résultat attendu doit être le même que celui de la question 2 de l'exercice 2.

λ ncsv2.js
la chaine à traiter
'  valeur1 ,  valeur2 ,   valeur3 composée de plusieurs mots,, valeur4,valeur5,  dernière valeur     '

Le tableau résultat

┌─────────┬──────────────────────────────────────┐
│ (index) │                Values                │
├─────────┼──────────────────────────────────────┤
│    0    │              'valeur1'               │
│    1    │              'valeur2'               │
│    2    │ 'valeur3 composée de plusieurs mots' │
│    3    │                  ''                  │   //  ,, absence de valeur --> chaîne vide
│    4    │              'valeur4'               │
│    5    │              'valeur5'               │
│    6    │          'dernière valeur'           │
└─────────┴──────────────────────────────────────┘

3.2 Recherche de motifs dans une chaîne

L'adresse physique (ou adresse MAC) d'une interface réseau consiste en une suite de 6 nombres à deux chiffres hexadécimaux séparés par "-" ou :. Par exemple: 01-32-54-F7-89-AB ou 01-32-54-f7-89-ab ou 01:32:54:F7:89:AB sont des adresses MAC valides. Par contre 01-32-54-K7-89-AB et 01:32-54-f7:89-ab ne sont pas valides.

Question 1 : Utilisez https://regex101.com/ pour retrouver les adresses MAC situées dans le texte précédant.

Le résultat attendu

Question 2 : En utilisant la méthode matchAll de \(String\) écrivez une fonction \(finMacAdresses(str)\) qui pour une chaîne de caractère donnée affiche toutes les adresses MAC valides reconnues ainsi que leur position dans la chaîne.

Exemple de résultats attendus

λ node findMacAdresses.js 
Recherche des adresses MAC valides dans la chaîne
'Par exemple: 01-32-54-F7-89-AB ou 01-32-54-f7-89-ab ou 01:32:54:F7:89:AB sont des adresses MAC valides. \
Par contre 01-32-54-K7-89-AB et 01:32-54-f7:89-ab ne sont pas valides.'

01-32-54-F7-89-AB  est une adresse MAC valide
     sa position dans la chaîne : 13 à 30 (non inclus)

01-32-54-f7-89-ab  est une adresse MAC valide
     sa position dans la chaîne : 34 à 51 (non inclus)

01:32:54:F7:89:AB  est une adresse MAC valide
     sa position dans la chaîne : 55 à 72 (non inclus)