Question Recherche dans un tableau d'objets.
- christophe
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 2
- Remerciements reçus 0
il y a 15 ans 2 mois #8192
par christophe
Recherche dans un tableau d'objets. a été créé par christophe
Bonjour à tous,
je cherche un moyen d'effectuer des recherches dans un tableau contenant des objets. Je m'explique :
j'ai un ensemble d'objets (ayant 4 propriétés) contenu dans un tableau $groups. Je cherche à pouvoir réaliser une recherche sur les valeurs des propriétés et en cas de résultat positif pouvoir récupérer l'index du tableau ainsi que les autres propriétés.
j'ai bien pensé faire une boucle en testant les 4 propriétés,mais côté optimisation
J'espère avoir été assez clair dans mes explications
Existe-t-il une fonction particulière ?
Auriez-vous une piste à me donner ?
je cherche un moyen d'effectuer des recherches dans un tableau contenant des objets. Je m'explique :
j'ai un ensemble d'objets (ayant 4 propriétés) contenu dans un tableau $groups. Je cherche à pouvoir réaliser une recherche sur les valeurs des propriétés et en cas de résultat positif pouvoir récupérer l'index du tableau ainsi que les autres propriétés.
j'ai bien pensé faire une boucle en testant les 4 propriétés,mais côté optimisation
J'espère avoir été assez clair dans mes explications
Existe-t-il une fonction particulière ?
Auriez-vous une piste à me donner ?
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 15 ans 2 mois #8196
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Recherche dans un tableau d'objets.
Salut,
une solution à l'aide de générique :
[code:1]
#Tableau d'objets
$T=1..10|% {New-object PSCustomObject -Property @{P1=($_* 2);P2=($_* 3);P3=(\"A\" * $_);P4=(\"B\" * (10-$_))} }
#Crée un délégué générique, de classe Prédicate
$deleg = New-Delegate System.Predicate[Object] {
param ($Value)
Write-Warning $value
$Value.P1 -eq 10 -and
$Value.P2 -eq 15 -and
$Value.P3 -eq 'AAAAA' -and
$Value.P4 -eq 'BBBBB'
}
#Obtient la signature de la méthode [System.Array]::FindIndex utilisant un délégué générique
#Il existe + signatures, on l'affiche à l'aide :
# [System.Array].GetMethods('Public, Static') | % { $_.ToString() }
[System.Reflection.MethodInfo] $Methode = GetMethodEx Array 'Int32 FindIndex[T](T[], System.Predicate`1[T])'
#Crée la méthode avec le type du tableau manipulé, à savoir [Object]
$MethodeGenerique = $Methode.MakeGenericMethod([Object])
#Appel la méthode via Invoke
$Index=$MethodeGenerique.Invoke($null,@($T,$Deleg))
#Résulat = 4
$T[$Index]
[/code:1]<br><br>Message édité par: Laurent Dardenne, à: 5/12/10 14:12
une solution à l'aide de générique :
[code:1]
#Tableau d'objets
$T=1..10|% {New-object PSCustomObject -Property @{P1=($_* 2);P2=($_* 3);P3=(\"A\" * $_);P4=(\"B\" * (10-$_))} }
#Crée un délégué générique, de classe Prédicate
$deleg = New-Delegate System.Predicate[Object] {
param ($Value)
Write-Warning $value
$Value.P1 -eq 10 -and
$Value.P2 -eq 15 -and
$Value.P3 -eq 'AAAAA' -and
$Value.P4 -eq 'BBBBB'
}
#Obtient la signature de la méthode [System.Array]::FindIndex utilisant un délégué générique
#Il existe + signatures, on l'affiche à l'aide :
# [System.Array].GetMethods('Public, Static') | % { $_.ToString() }
[System.Reflection.MethodInfo] $Methode = GetMethodEx Array 'Int32 FindIndex[T](T[], System.Predicate`1[T])'
#Crée la méthode avec le type du tableau manipulé, à savoir [Object]
$MethodeGenerique = $Methode.MakeGenericMethod([Object])
#Appel la méthode via Invoke
$Index=$MethodeGenerique.Invoke($null,@($T,$Deleg))
#Résulat = 4
$T[$Index]
[/code:1]<br><br>Message édité par: Laurent Dardenne, à: 5/12/10 14:12
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Jacques Barathon
- Hors Ligne
- Administrateur
-
Réduire
Plus d'informations
- Messages : 576
- Remerciements reçus 0
il y a 15 ans 2 mois #8204
par Jacques Barathon
Réponse de Jacques Barathon sur le sujet Re:Recherche dans un tableau d'objets.
Plus prosaïquement, ceci peut permettre de filtrer les objets d'un tableau selon la correspondance d'une de leurs propriétés avec un texte donné :
[code:1]
$array | where {($_ | select * | out-string) -match \"texte\"}
[/code:1]
On peut sans doute optimiser, mais tel quel ça devrait marcher (testé sur deux ou trois tableaux vite fait, tout retour sera le bienvenu
).
Attention quand même, tel quel le résultat de la correspondance porte à la fois sur le contenu et sur le nom des propriétés.<br><br>Message édité par: janel, à: 6/12/10 10:03
[code:1]
$array | where {($_ | select * | out-string) -match \"texte\"}
[/code:1]
On peut sans doute optimiser, mais tel quel ça devrait marcher (testé sur deux ou trois tableaux vite fait, tout retour sera le bienvenu
Attention quand même, tel quel le résultat de la correspondance porte à la fois sur le contenu et sur le nom des propriétés.<br><br>Message édité par: janel, à: 6/12/10 10:03
Connexion ou Créer un compte pour participer à la conversation.
- Arthur
- Hors Ligne
- Membre elite
-
Réduire
Plus d'informations
- Messages : 226
- Remerciements reçus 0
il y a 15 ans 2 mois #8210
par Arthur
Réponse de Arthur sur le sujet Re:Recherche dans un tableau d'objets.
Je ne sais pas si c'est le plus optimisé mais si tu veux faire une recherche dans un tableau suivant une ou plusieurs propriétés pourquoi ne pas filtrer le tableau de cette façon ?
(Avec un le meme tableau que celui de laurent)
[code:1]$T | Where { $_.P1 -eq 2 } | Where { $_.P2 -eq 3 } | where { $_.P3 -eq \"A\" } | wher
e { $_.P4 -eq \"BBBBBBBBB\" }[/code:1]
(Avec un le meme tableau que celui de laurent)
[code:1]$T | Where { $_.P1 -eq 2 } | Where { $_.P2 -eq 3 } | where { $_.P3 -eq \"A\" } | wher
e { $_.P4 -eq \"BBBBBBBBB\" }[/code:1]
Connexion ou Créer un compte pour participer à la conversation.
- Jacques Barathon
- Hors Ligne
- Administrateur
-
Réduire
Plus d'informations
- Messages : 576
- Remerciements reçus 0
il y a 15 ans 2 mois #8211
par Jacques Barathon
Réponse de Jacques Barathon sur le sujet Re:Recherche dans un tableau d'objets.
Une version un peu plus évoluée qui évite de tomber sur des occurrences de texte qui figureraient dans les noms de propriétés :
[code:1]
# where-text.ps1
param ([String]$text)
@($input) | where {
($_.psobject.properties | foreach {$_.value} | out-string) -match $text
}
[/code:1]
Par exemple :
[code:1]
PS> get-service | where-text messenger
Status Name DisplayName
----
Running lanmanworkstation Workstation
Stopped Messenger Messenger
Running PlugPlay Plug and Play
Running RpcSs Remote Procedure Call (RPC)
[/code:1]
[code:1]
# where-text.ps1
param ([String]$text)
@($input) | where {
($_.psobject.properties | foreach {$_.value} | out-string) -match $text
}
[/code:1]
Par exemple :
[code:1]
PS> get-service | where-text messenger
Status Name DisplayName
----
Running lanmanworkstation Workstation
Stopped Messenger Messenger
Running PlugPlay Plug and Play
Running RpcSs Remote Procedure Call (RPC)
[/code:1]
Connexion ou Créer un compte pour participer à la conversation.
- Jacques Barathon
- Hors Ligne
- Administrateur
-
Réduire
Plus d'informations
- Messages : 576
- Remerciements reçus 0
il y a 15 ans 2 mois #8213
par Jacques Barathon
Réponse de Jacques Barathon sur le sujet Re:Recherche dans un tableau d'objets.
Petite correction qui permet de faire des recherches plus précises sur une valeur de propriété en utilisant la syntaxe des expressions régulières :
[code:1]
# where-text
param ([String]$text)
@($input) | where {
($_.psobject.properties | foreach {$_.value} | out-string -stream) -match $text
}
[/code:1]
En reprenant l'objet $T créé par Laurent dans son premier exemple, on peut donc faire les filtrages suivants :
[code:1]
# création du tableau $T :
PS> $T=1..10|% {New-object PSCustomObject -Property @{P1=($_* 2);P2=($_* 3);P3=(\"A\" * $_);P4=(\"B\" * (10-$_))}}
# éléments dont une propriété se termine par 3 :
PS> $T | where-text '3$'
P2 P1 P4 P3
-- -- -- --
3 2 BBBBBBBBB A
# éléments dont une propriété est une chaîne avec au moins 4 'B' à la suite :
PS> $T | where-text 'B{4}'
P2 P1 P4 P3
-- -- -- --
3 2 BBBBBBBBB A
6 4 BBBBBBBB AA
9 6 BBBBBBB AAA
12 8 BBBBBB AAAA
15 10 BBBBB AAAAA
18 12 BBBB AAAAAA
# éléments dont une propriété est exactement 'AAA'
PS> $T | where-text '^AAA$'
P2 P1 P4 P3
-- -- -- --
9 6 BBBBBBB AAA
[/code:1]
[code:1]
# where-text
param ([String]$text)
@($input) | where {
($_.psobject.properties | foreach {$_.value} | out-string -stream) -match $text
}
[/code:1]
En reprenant l'objet $T créé par Laurent dans son premier exemple, on peut donc faire les filtrages suivants :
[code:1]
# création du tableau $T :
PS> $T=1..10|% {New-object PSCustomObject -Property @{P1=($_* 2);P2=($_* 3);P3=(\"A\" * $_);P4=(\"B\" * (10-$_))}}
# éléments dont une propriété se termine par 3 :
PS> $T | where-text '3$'
P2 P1 P4 P3
-- -- -- --
3 2 BBBBBBBBB A
# éléments dont une propriété est une chaîne avec au moins 4 'B' à la suite :
PS> $T | where-text 'B{4}'
P2 P1 P4 P3
-- -- -- --
3 2 BBBBBBBBB A
6 4 BBBBBBBB AA
9 6 BBBBBBB AAA
12 8 BBBBBB AAAA
15 10 BBBBB AAAAA
18 12 BBBB AAAAAA
# éléments dont une propriété est exactement 'AAA'
PS> $T | where-text '^AAA$'
P2 P1 P4 P3
-- -- -- --
9 6 BBBBBBB AAA
[/code:1]
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.097 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les initiés
- Recherche dans un tableau d'objets.