Question [Résolu] Boucle For

Plus d'informations
il y a 9 ans 7 mois #22135 par Roninjin
[Résolu] Boucle For a été créé par Roninjin
Bonjour,

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 :dry:<br><br>Message édité par: Arnaud, à: 2/09/16 15:25

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 9 ans 7 mois #22138 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Boucle For
Salut,
roninjin écrit:

Je suis perdu :dry:

On peut utiliser des sous-ensembles, et puisque le trigramme est ordonné rechercher l'existant :
[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)&gt; $null

$debugPreferecne='Continue'
'taz','Tda','tba','tad','tcb','TAZ','tad','taz'|
Foreach {
Write-Debug \&quot;`r`n\&quot;
Write-Debug \&quot;`Traite $_\&quot;
$Trigramme=$_.ToUpper()
$Existant=@($Trg -like \&quot;$Trigramme*\&quot;|Sort-Object)
if ($Existant.Count -eq 0)
{
Write-Debug \&quot;'$Trigramme' inexistant. Ajoute '$Trigramme'\&quot;
$Trg.Add($Trigramme) &gt; $null
}
elseif ($Existant.Count -eq 1)
{
Write-Debug \&quot;un seul '$Trigramme'. Ajoute '${Trigramme}1'\&quot;
$Trg.Add(\&quot;${Trigramme}1\&quot;«») &gt;$null
}
else
{
Write-Debug \&quot; $($Existant.Count) '$Trigramme' existant. Ajoute '$($Trigramme+$($Existant.Count))'\&quot;
$Trg.Add(($Trigramme+$($Existant.Count))) &gt; $null
}
}

Write-Host \&quot;`r`nRésultat\&quot;
$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 :P<br><br>Message édité par: Laurent Dardenne, à: 12/08/16 23:06

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 9 ans 7 mois #22139 par Philippe
Réponse de Philippe sur le sujet Re:Boucle For
Laurent Dardenne écrit:

Une petite remarque, en cas de doublon on ne manipule plus un trigramme :P

TBA1 reste un trigramme (puisque 3 lettres) mais avec un chiffre en plus :P :P
mais sinon pour resté sur trois caractères il y a le trigrammes constitué d'un digrammes et d'un chiffre !!! :laugh:

Il y a surement des approches plus rapide en cas de volumétrie importante.

pour revenir au sujet du post, je te renvoie sur un ancien post de Laurent qui utilisé le HashSet

[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($_)} &gt; $null

'taz','Tda','tba','tad','tcb','TAZ','tad','taz'| foreach {
$Trigramme = $_.ToUpper()
$i = 0
Write-Debug \&quot;`Traite $_\&quot;
while (-not $hset.Add($Trigramme.ToUpper())) {
Write-Debug \&quot;`t'$Trigramme' present. \&quot;
$i++
$Trigramme = \&quot;$($_.ToUpper())$i\&quot;
Write-Debug \&quot;`tessai avec '$Trigramme'\&quot;
}
}

Write-Host \&quot;`r`nRésultat\&quot;
$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.

Plus d'informations
il y a 9 ans 7 mois #22140 par Roninjin
Réponse de Roninjin sur le sujet Re:Boucle For
Merci pour les réponses mais soit j'ai pas compris comment tout ça fonctionne soit ça ne correspond pas à mon besoin.
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... :dry:
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 :lol:

Merci de votre aide.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 9 ans 7 mois #22141 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Boucle For
@6ratgus Merci.

roninjin écrit:

soit ça ne correspond pas à mon besoin.

Si, à celui de ton premier post B)
roninjin écrit:

Vérification de ce trigrammes dans bases SQL pour voir si il existe ou pas.

Là ça ne correspond plus, je suis d'accord :)
roninjin écrit:

2) Je créé une boucle
a)boucle dans la base pour voir si il existe (TBA)
b)si il existe ajoute 1

:S freine !!!!
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.

Plus d'informations
il y a 9 ans 7 mois #22144 par Roninjin
Réponse de Roninjin sur le sujet Re:Boucle For
ça aurait pu être la bonne solution mais malheureusement je viens de me rendre compte que ça ne marche pas si bien que ça par exemple :
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 &amp; lettres.Une astuce ?

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.098 secondes
Propulsé par Kunena