Le nom le plus long
Saurez-vous retrouver la personne avec le nom le plus long de votre annuaire ?
Dans les solutions ennoncées, je me base sur mon fichier CSV qui est récupérable avec ce bout de code :
$uri = "https://raw.githubusercontent.com/leobouard/leobouard.github.io/main/assets/files/users.csv"
$users = (Invoke-WebRequest -Uri $uri).Content | ConvertFrom-Csv -Delimiter ';'
Droit au but et de manière scolaire, on va calculer la longueur du nom de chaque utilisateur. Si le nom est plus long que le précédent “record”, on garde le nom & la longueur de celui-ci en mémoire.
$longestName = ""
$maxLength = 0
$users | Foreach-Object {
$name = $_.displayName
$length = ($_.displayName).Length
if ($length -gt $maxLength) {
$maxLength = $length
$longestName = $name
}
}
"`'$longestName`' est le nom le plus long avec $maxLength caractères"
C’est bien sympa mais dans ce modèle, il ne peut y avoir qu’un seul “record” (même si dans la réalité la première place est peut-être partagée entre plusieurs noms).
On pourrait modifier le comportement du script en lui demandant d’afficher le texte “Pierre Dupont est le nom le plus long avec 13 caractères” à chaque fois que le record est battu ou égalé. On peut faire ça en modifiant l’opérateur de comparaison de -gt
(plus grand que) à -ge
(plus grand ou égal) :
$longestName = ""
$maxLength = 0
$users | Foreach-Object {
$name = $_.displayName
$length = ($_.displayName).Length
if ($length -ge $maxLength) {
$maxLength = $length
$longestName = $name
"`'$longestName`' est le nom le plus long (pour l'instant) avec $maxLength caractères"
}
}
Ça reste deux solutions valables puisqu’elles répondent bien à la question de départ : Qui a le nom le plus long ?
Cette fois-ci, on va un peu plus loin et on va venir dresser un classement des noms :
$users | ForEach-Object {
$_ | Add-Member -MemberType NoteProperty -Name nameLength -Value ($_.displayName).Length -Force
}
$users | Sort-Object -Property nameLength -Descending |
Select-Object -First 10 |
Format-Table displayName,country,city,nameLength
Pour ça, on ajoute une nouvelle propriété “nameLength” à notre objet de base. Une fois que tous les utilisateurs ont reçu cette nouvelle propriété, il suffit simplement de trier les objets du nom le plus long au nom le plus court… et c’est bon !
Simple et efficace :
DisplayName | Country | City | NameLength |
---|---|---|---|
Alexandrin Courtemanche | FR | BELFORT | 23 |
Alphonsine De La Vergne | FR | AUXERRE | 23 |
Christophe Deslauriers | CH | STECKBORN | 22 |
On pourrait même faire une version dérivée qui se passerait de la boucle ForEach-Object
. Pour ça, on utilise la commande Select-Object
pour calculer la propriété “nameLength” à la volée :
$users |Select-Object displayName,@{Name='nameLength';Expression={($_.displayName).Length}} |
Sort-Object nameLength -Descending |
Select-Object -First 10 |
Format-Table
Et on peut même envisager une version condensée en seulement 80 caractères :
($users|select displayName,@{N='l';E={($_.displayName).Length}}|sort l -d)[0..9]
Saurez-vous retrouver la personne avec le nom le plus long de votre annuaire ?
Commentaires