Question
[Résolu] Boucle For
- Roninjin
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 17
- Remerciements reçus 0
je dois creer un trigrame pour les nouveaux utilisateurs par rapport à leur nom & prenom ce que j'ai reussi avec :
[code:1] $Trigram = ([string]$Firstname[0]).ToUpper()+([string]$Lastname[0]).ToUpper()+([string]$Lastname[1]).ToUpper()
[/code:1]
Ex : TBA
Ensuite je dois comparer ce trigramme avec des trigrammes déjà existant pour savoir si c'est un doublon, si c’est le cas je lui dit d'ajouter un 1, ex: TBA1, si TBA1 existe je lui dit de le transformer en TBA2 etc etc...
je sais qu'il faut utiliser For mais j'ai du mal à voir comment faire.
Je suis perdu
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
roninjin écrit:
On peut utiliser des sous-ensembles, et puisque le trigramme est ordonné rechercher l'existant :Je suis perdu
[code:1]
$T=@(
'TAD',
'TBA',
'TBA1',
'TBA2',
'TCB',
'TCB1',
'TDA',
'TDA1',
'TDA2',
'TDA3',
'TDA4',
'TDA5',
'TDA6',
'TDA7',
'TDA8',
'TDA9',
'TDA10',
'TDA11'
)
$Trg=new-object System.Collections.ArrayList
$Trg.Addrange($T)> $null
$debugPreferecne='Continue'
'taz','Tda','tba','tad','tcb','TAZ','tad','taz'|
Foreach {
Write-Debug \"`r`n\"
Write-Debug \"`Traite $_\"
$Trigramme=$_.ToUpper()
$Existant=@($Trg -like \"$Trigramme*\"|Sort-Object)
if ($Existant.Count -eq 0)
{
Write-Debug \"'$Trigramme' inexistant. Ajoute '$Trigramme'\"
$Trg.Add($Trigramme) > $null
}
elseif ($Existant.Count -eq 1)
{
Write-Debug \"un seul '$Trigramme'. Ajoute '${Trigramme}1'\"
$Trg.Add(\"${Trigramme}1\"«») >$null
}
else
{
Write-Debug \" $($Existant.Count) '$Trigramme' existant. Ajoute '$($Trigramme+$($Existant.Count))'\"
$Trg.Add(($Trigramme+$($Existant.Count))) > $null
}
}
Write-Host \"`r`nRésultat\"
$trg |sort
$debugPreference='SilentlyContinue'
[/code:1]
Il y a surement des approches plus rapide en cas de volumétrie importante.
Une petite remarque, en cas de doublon on ne manipule plus un trigramme
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Philippe
- Hors Ligne
- Modérateur
-
- Messages : 1778
- Remerciements reçus 21
TBA1 reste un trigramme (puisque 3 lettres) mais avec un chiffre en plusUne petite remarque, en cas de doublon on ne manipule plus un trigramme
mais sinon pour resté sur trois caractères il y a le trigrammes constitué d'un digrammes et d'un chiffre !!!
pour revenir au sujet du post, je te renvoie sur un ancien post de Laurent qui utilisé le HashSetIl y a surement des approches plus rapide en cas de volumétrie importante.
[code:1]
$debugPreference = 'Continue'
$T=@(
'TAD',
'TBA',
'TBA1',
'TBA2',
'TCB',
'TCB1',
'TDA',
'TDA1',
'TDA2',
'TDA3',
'TDA4',
'TDA5',
'TDA6',
'TDA7',
'TDA8',
'TDA9',
'TDA10',
'TDA11'
)
$hset = new-object System.Collections.Generic.HashSet[string]
$T | foreach {$hset.Add($_)} > $null
'taz','Tda','tba','tad','tcb','TAZ','tad','taz'| foreach {
$Trigramme = $_.ToUpper()
$i = 0
Write-Debug \"`Traite $_\"
while (-not $hset.Add($Trigramme.ToUpper())) {
Write-Debug \"`t'$Trigramme' present. \"
$i++
$Trigramme = \"$($_.ToUpper())$i\"
Write-Debug \"`tessai avec '$Trigramme'\"
}
}
Write-Host \"`r`nRésultat\"
$trg | sort
$debugPreference='SilentlyContinue' [/code:1]
d'après cette article je pense pas que ça soit plus rapide d'utilisé les hashset par rapport à la technique de Laurent mais c'est pour montré qu'il existe plus d'une méthode pour faire le travail !!
PS : Laurent tu a une petite erreur de frappe dans ton script sur deux lignes :
[code:1]$debugPreferecne='Continue'
# ça fonctionne mieux comme ça :
$debugPreference = 'Continue'[/code:1]et la dernière ligne aussi
Connexion ou Créer un compte pour participer à la conversation.
- Roninjin
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 17
- Remerciements reçus 0
Je pense à la première solution.
Je vous explique la situation :
- Un AD avec des users déjà inscrit ayant donc deja des trigrammes
- Automatisation de la création des nouveaux users dans l'AD via script powershell
- Automatisation de la création des nouveaux users dans les outils métiers, (bases SQL,MySQL entre autres),creation d'un trigramme via script powershell
le but : Pour la création des nouveaux users :
- Création d'un trigramme (1ere lettre du prénom +2 premières lettre du nom) pour les outils métiers
-Vérification de ce trigrammes dans bases SQL pour voir si il existe ou pas.
- Si il existe ajouter 1 au trigramme (TBA1 si TBA existe déjà, TBA2 si TBA1 existe déjà,etc...)
Je pensais plus a une solution du genre :
1) Je créé mon trigramme
2) Je créé une boucle
a)boucle dans la base pour voir si il existe (TBA)
b)si il existe ajoute 1 à la fin (TBA1)
c)boucle dans la base pour voir si il existe (toujours TBA1)
d)si il existe ajoute 2 à la fin (TBA2)
etc....
C'est peut être mon approche qui n'est pas la bonne...
Je précise que je n'attend pas la réponse tombée dans mon bec j'ai déjà fait pas mal de chose pour l'automatisation, mais la gestion de ce trigramme me fait faire des cauchemards
Merci de votre aide.
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
roninjin écrit:
Si, à celui de ton premier postsoit ça ne correspond pas à mon besoin.
roninjin écrit:
Là ça ne correspond plus, je suis d'accordVérification de ce trigrammes dans bases SQL pour voir si il existe ou pas.
roninjin écrit:
2) Je créé une boucle
a)boucle dans la base pour voir si il existe (TBA)
b)si il existe ajoute 1
Exécute une requête sur la base (la notion d'ensemble)
, c'est elle qui détient l'info s'il existe ou pas et s'il existe te renverra le dernier trigramme créé.
C'est donc le dernier de la liste ordonnée qui te permet de déduire le nom du prochain trigramme à créer.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Roninjin
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 17
- Remerciements reçus 0
la requête des trigramme existant me retourne :
GDE
GDE1
GDE3
GDE4
GDE5
GDE6
GDE7
GDE8
ce qui fait 7 résultats, donc le prochain à créer devrait être le GDE8 mais il existe déjà ! J'ai meme pu voir des GDEP par exemple....
Mon idée : separer la chaîne de caractère en 2 :
- 1er groupe les 3 premiers caractères
- 2nd groupe les derniers caracteres seuelement si ce sont des nombres
Ajouter +1 à la 2nde chaine et fusionner le tout.
Mais je ne sais pas comment faire pour différencier chiffres & lettres.Une astuce ?
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- [Résolu] Boucle For