Question
[Résolu] Filtre tableau
- crouzille
- Auteur du sujet
- Hors Ligne
- Membre junior
-
Réduire
Plus d'informations
- Messages : 34
- Remerciements reçus 0
il y a 15 ans 5 mois #7862
par crouzille
[Résolu] Filtre tableau a été créé par crouzille
Bonjour à tous.
Voila je suis confronté à un petit problème où j'espère que la communauté pourra m'aider.
Prenons un tableau exemple: $tab
IP : 10.72.51.38
HF : 9:15
HD : 11:56
CalleeIp : znk188918
Chemin : test
(Dans mon cas c'est un tableau d'environ 50000 lignes avec plus de colonnes)
Ce que je souhaiterai, c'est pouvoir appliquer des filtres sur ce tableau.
Par exemple je possède une IP de 10.72.6.30, et je souhaiterai que $tab2 comprenne les lignes possédant 10.72.6.30 en gardant les en-tête des colonnes et tout ceci sans générer un seul fichier texte.
Cela est'il possible?
Merci d'avance<br><br>Message édité par: Arnaud, à: 7/10/10 15:45
Voila je suis confronté à un petit problème où j'espère que la communauté pourra m'aider.
Prenons un tableau exemple: $tab
IP : 10.72.51.38
HF : 9:15
HD : 11:56
CalleeIp : znk188918
Chemin : test
(Dans mon cas c'est un tableau d'environ 50000 lignes avec plus de colonnes)
Ce que je souhaiterai, c'est pouvoir appliquer des filtres sur ce tableau.
Par exemple je possède une IP de 10.72.6.30, et je souhaiterai que $tab2 comprenne les lignes possédant 10.72.6.30 en gardant les en-tête des colonnes et tout ceci sans générer un seul fichier texte.
Cela est'il possible?
Merci d'avance<br><br>Message édité par: Arnaud, à: 7/10/10 15:45
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 5 mois #7863
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Filtre tableau
Salut,
quel est exactement la structure de données que tu utilises ? Un tableau d'objet personnalisé, un tableau de chaînes ?
Comptes-tu effectuer un seul traitement de ce type ou + et ce de façon régulière ou pas ?
quel est exactement la structure de données que tu utilises ? Un tableau d'objet personnalisé, un tableau de chaînes ?
Comptes-tu effectuer un seul traitement de ce type ou + et ce de façon régulière ou pas ?
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- crouzille
- Auteur du sujet
- Hors Ligne
- Membre junior
-
Réduire
Plus d'informations
- Messages : 34
- Remerciements reçus 0
il y a 15 ans 5 mois #7864
par crouzille
Réponse de crouzille sur le sujet Re:Filtre tableau
Je fais un import-csv :
$call_log = import-csv E:\Programmes_extractions_V3\Login\Call_log.csv
Voici un extrait d'une ligne de ce tableau:
CallId : 4c78bff20000102d
SetupTime : 2010-08-29 07:58:57
AlertingTime : 2010-08-29 07:58:57
ConnectTime : 2010-08-29 07:58:57
DisconnectTime : 2010-08-29 07:58:59
Duration : 1
TotalDuration : 1
FileName :
CallerIp :
CallerPort :
CallerMAC : 10.72.48.134
CallerSyncInfo : 14284
CallerCodec : 00-04-0D-51-B4-AD
CallerPacketsReceived :
CallerPacketsLost :
CallerPacketsOutOfOrder :
CallerPacketsBad : 10.72.51.38
CalleeIp : 6474
CalleePort : 00-09-6E-10-2C-F5
CalleeMAC : 20100829075857.wav
CalleeSyncInfo : D:\RecordAVAYA\20100829\20100829075857.wav
CalleeCodec :
CalleePacketsReceived :
CalleePacketsLost :
CalleePacketsOutOfOrder :
CalleePacketsBad :
FileNameFull :
Je compte effectuer plusieurs traitement de ce type à la suite afin d'avoir juste les information que je souhaite. exemple: filtre sur la date ensuite filtre sur IP etc
$call_log = import-csv E:\Programmes_extractions_V3\Login\Call_log.csv
Voici un extrait d'une ligne de ce tableau:
CallId : 4c78bff20000102d
SetupTime : 2010-08-29 07:58:57
AlertingTime : 2010-08-29 07:58:57
ConnectTime : 2010-08-29 07:58:57
DisconnectTime : 2010-08-29 07:58:59
Duration : 1
TotalDuration : 1
FileName :
CallerIp :
CallerPort :
CallerMAC : 10.72.48.134
CallerSyncInfo : 14284
CallerCodec : 00-04-0D-51-B4-AD
CallerPacketsReceived :
CallerPacketsLost :
CallerPacketsOutOfOrder :
CallerPacketsBad : 10.72.51.38
CalleeIp : 6474
CalleePort : 00-09-6E-10-2C-F5
CalleeMAC : 20100829075857.wav
CalleeSyncInfo : D:\RecordAVAYA\20100829\20100829075857.wav
CalleeCodec :
CalleePacketsReceived :
CalleePacketsLost :
CalleePacketsOutOfOrder :
CalleePacketsBad :
FileNameFull :
Je compte effectuer plusieurs traitement de ce type à la suite afin d'avoir juste les information que je souhaite. exemple: filtre sur la date ensuite filtre sur IP etc
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 5 mois #7867
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Filtre tableau
Si les champs sont tous de type string :
[code:1]
$tab=@()
$tab+=New-object PSObject -Property @{
SetupTime=\"2010-08-29 07:58:57\";
TotalDuration = 1;
CallerMAC = \"10.72.48.134\";
CalleePort=\"00-09-6E-10-2C-F6\";
CalleeSyncInfo=\"D:RecordAVAYA2010082920100829075857.wav\"
}
$tab+=New-object PSObject -Property @{
SetupTime=\"2010-08-27 07:58:57\";
TotalDuration = 1;
CallerMAC=\"10.72.48.134\";
CalleePort=\"00-09-6E-10-2C-F5\";
CalleeSyncInfo=\"D:RecordAVAYA2010082720100829075857.wav\"
}
$tab+=New-object PSObject -Property @{
SetupTime=\"2010-09-29 07:58:57\";
TotalDuration = 2;
CallerMAC=\"10.72.48.135\";
CalleePort=\"00-09-6E-10-2C-F6\";
CalleeSyncInfo=\"D:RecordAVAYA2010092920100829075857.wav\"
}
$tab+=New-object PSObject -Property @{
SetupTime=\"2010-08-29 08:58:57\";
TotalDuration = 2;
CallerMAC=\"10.72.48.136\";
CalleePort=\"00-09-6E-10-2C-F5\";
CalleeSyncInfo=\"D:RecordAVAYA2010082920100829085857.wav\"
}
[/code:1]
On peut utiliser un filtre paramétré :
[code:1]
# Pour un test if cherche à récupérer un résultat boolean ($true ou $false)
Filter Where-LogProperty($Property,$Data) {if ($_.\"$Property\" -match $Data) {$_}}
$Tab|Where-LogProperty \"CallerMAC\" \"10.72.48.134\"
$Tab|Where-LogProperty \"CallerMAC\" \"10.72.48.135\"
$Tab|Where-LogProperty \"SetupTime\" \"2010-08-29 08:58:57\"
[/code:1]
Si les champs sont de types différent :
[code:1]
$tab=@()
$tab+=New-object PSObject -Property @{
SetupTime=\"2010-08-29 07:58:57\" -as [DateTime];
TotalDuration = 1;
CallerMAC =[System.Net.IPAddress]\"10.72.48.134\";
CalleePort=\"00-09-6E-10-2C-F6\";
CalleeSyncInfo=\"D:RecordAVAYA2010082920100829075857.wav\"
}
$tab+=New-object PSObject -Property @{
SetupTime=\"2010-08-27 07:58:57\" -as [DateTime];
TotalDuration = 1;
CallerMAC=[System.Net.IPAddress]\"10.72.48.134\";
CalleePort=\"00-09-6E-10-2C-F5\";
CalleeSyncInfo=\"D:RecordAVAYA2010082720100829075857.wav\"
}
$tab+=New-object PSObject -Property @{
SetupTime=\"2010-09-29 07:58:57\" -as [DateTime];
TotalDuration = 2;
CallerMAC=[System.Net.IPAddress]\"10.72.48.135\";
CalleePort=\"00-09-6E-10-2C-F6\";
CalleeSyncInfo=\"D:RecordAVAYA2010092920100829075857.wav\"
}
$tab+=New-object PSObject -Property @{
SetupTime=\"2010-08-29 08:58:57\" -as [DateTime];
TotalDuration = 2;
CallerMAC=[System.Net.IPAddress]\"10.72.48.136\";
CalleePort=\"00-09-6E-10-2C-F5\";
CalleeSyncInfo=\"D:RecordAVAYA2010082920100829085857.wav\"
$tab+=New-object PSObject -Property @{
SetupTime=$Null;
TotalDuration = 2;
CallerMAC=$Null;
CalleePort=\"00-09-6E-10-2C-F5\";
CalleeSyncInfo=\"D:RecordAVAYA2010082920100829085857.wav\"
}
[/code:1]
On peut s'appuyer sur un scriptblock, ce qui laisse la possibilité de combiner plusieurs critères :
[code:1]
Filter Where-LogProperty($SB,$Data) {if (&$SB«») {$_}}
#utilise la variable $Data déclarée dans la portée du filtre
$sbIp={$_.CallerMAC -eq $Data}
$sbDate={$_.SetupTime -eq $Data}
#recherche via une string
$Tab|Where-LogProperty $sbIp \"10.72.48.134\"
#recherche via un objet de type IPAddress
$MyIP=[System.Net.IPAddress]\"10.72.48.135\"
$Tab|Where-LogProperty $sbIp $MyIP
$MyDate=\"2010-08-29 07:58:57\" -as [DateTime]
$Tab|Where-LogProperty $sbDate $MyDate
#combinaison de filtre
$sbIpOrDate={$_.CallerMAC -eq $Data[0] -or $_.SetupTime -eq $Data[1]}
$Tab|Where-LogProperty $sbIpOrDate $MyIP,$MyDate
[/code:1]
Le test du scriptblock utilise le comportement suivant :
[code:1]
$sbNull={$null}
$sbNotNull={\"renvoi un objet\"}
if (&$sbNull) {Write-Warning \"L'appel du scriptblock renvoi true\"}
if (&$sbnotNull) {Write-Warning \"L'appel du scriptblock renvoi true\"}
#AVERTISSEMENT : L'appel du scriptblock renvoi true
[/code:1]
On peut regrouper les scripblocks dans une hashtable
[code:1]
$Filtres=@{
Ip={$_.CallerMAC -eq $Data};
Date={$_.SetupTime -eq $Data};
IpOrDate={$_.CallerMAC -eq $Data[0] -or $_.SetupTime -eq $Data[1]}
}
$Tab|Where-LogProperty $Filtres.Ip \"10.72.48.134\"
$Tab|Where-LogProperty $Filtres.Ip $MyIP
$Tab|Where-LogProperty $Filtres.Date $MyDate
$Tab|Where-LogProperty $Filtres.IpOrDate $MyIP,$MyDate
[/code:1]
Vérifie si cela répond à ton besoin et ou à tes données.
Il se peut qu'une recherche à l'aide de regex dans le fichier texte d'origine soit plus rapide voir utiliser une table Access(SQL), je te laisse tester.
Si je me souviens bien on peut créer des tables Access sans devoir l'installer (via ADO)...<br><br>Message édité par: Laurent Dardenne, à: 29/09/10 14:33
[code:1]
$tab=@()
$tab+=New-object PSObject -Property @{
SetupTime=\"2010-08-29 07:58:57\";
TotalDuration = 1;
CallerMAC = \"10.72.48.134\";
CalleePort=\"00-09-6E-10-2C-F6\";
CalleeSyncInfo=\"D:RecordAVAYA2010082920100829075857.wav\"
}
$tab+=New-object PSObject -Property @{
SetupTime=\"2010-08-27 07:58:57\";
TotalDuration = 1;
CallerMAC=\"10.72.48.134\";
CalleePort=\"00-09-6E-10-2C-F5\";
CalleeSyncInfo=\"D:RecordAVAYA2010082720100829075857.wav\"
}
$tab+=New-object PSObject -Property @{
SetupTime=\"2010-09-29 07:58:57\";
TotalDuration = 2;
CallerMAC=\"10.72.48.135\";
CalleePort=\"00-09-6E-10-2C-F6\";
CalleeSyncInfo=\"D:RecordAVAYA2010092920100829075857.wav\"
}
$tab+=New-object PSObject -Property @{
SetupTime=\"2010-08-29 08:58:57\";
TotalDuration = 2;
CallerMAC=\"10.72.48.136\";
CalleePort=\"00-09-6E-10-2C-F5\";
CalleeSyncInfo=\"D:RecordAVAYA2010082920100829085857.wav\"
}
[/code:1]
On peut utiliser un filtre paramétré :
[code:1]
# Pour un test if cherche à récupérer un résultat boolean ($true ou $false)
Filter Where-LogProperty($Property,$Data) {if ($_.\"$Property\" -match $Data) {$_}}
$Tab|Where-LogProperty \"CallerMAC\" \"10.72.48.134\"
$Tab|Where-LogProperty \"CallerMAC\" \"10.72.48.135\"
$Tab|Where-LogProperty \"SetupTime\" \"2010-08-29 08:58:57\"
[/code:1]
Si les champs sont de types différent :
[code:1]
$tab=@()
$tab+=New-object PSObject -Property @{
SetupTime=\"2010-08-29 07:58:57\" -as [DateTime];
TotalDuration = 1;
CallerMAC =[System.Net.IPAddress]\"10.72.48.134\";
CalleePort=\"00-09-6E-10-2C-F6\";
CalleeSyncInfo=\"D:RecordAVAYA2010082920100829075857.wav\"
}
$tab+=New-object PSObject -Property @{
SetupTime=\"2010-08-27 07:58:57\" -as [DateTime];
TotalDuration = 1;
CallerMAC=[System.Net.IPAddress]\"10.72.48.134\";
CalleePort=\"00-09-6E-10-2C-F5\";
CalleeSyncInfo=\"D:RecordAVAYA2010082720100829075857.wav\"
}
$tab+=New-object PSObject -Property @{
SetupTime=\"2010-09-29 07:58:57\" -as [DateTime];
TotalDuration = 2;
CallerMAC=[System.Net.IPAddress]\"10.72.48.135\";
CalleePort=\"00-09-6E-10-2C-F6\";
CalleeSyncInfo=\"D:RecordAVAYA2010092920100829075857.wav\"
}
$tab+=New-object PSObject -Property @{
SetupTime=\"2010-08-29 08:58:57\" -as [DateTime];
TotalDuration = 2;
CallerMAC=[System.Net.IPAddress]\"10.72.48.136\";
CalleePort=\"00-09-6E-10-2C-F5\";
CalleeSyncInfo=\"D:RecordAVAYA2010082920100829085857.wav\"
$tab+=New-object PSObject -Property @{
SetupTime=$Null;
TotalDuration = 2;
CallerMAC=$Null;
CalleePort=\"00-09-6E-10-2C-F5\";
CalleeSyncInfo=\"D:RecordAVAYA2010082920100829085857.wav\"
}
[/code:1]
On peut s'appuyer sur un scriptblock, ce qui laisse la possibilité de combiner plusieurs critères :
[code:1]
Filter Where-LogProperty($SB,$Data) {if (&$SB«») {$_}}
#utilise la variable $Data déclarée dans la portée du filtre
$sbIp={$_.CallerMAC -eq $Data}
$sbDate={$_.SetupTime -eq $Data}
#recherche via une string
$Tab|Where-LogProperty $sbIp \"10.72.48.134\"
#recherche via un objet de type IPAddress
$MyIP=[System.Net.IPAddress]\"10.72.48.135\"
$Tab|Where-LogProperty $sbIp $MyIP
$MyDate=\"2010-08-29 07:58:57\" -as [DateTime]
$Tab|Where-LogProperty $sbDate $MyDate
#combinaison de filtre
$sbIpOrDate={$_.CallerMAC -eq $Data[0] -or $_.SetupTime -eq $Data[1]}
$Tab|Where-LogProperty $sbIpOrDate $MyIP,$MyDate
[/code:1]
Le test du scriptblock utilise le comportement suivant :
[code:1]
$sbNull={$null}
$sbNotNull={\"renvoi un objet\"}
if (&$sbNull) {Write-Warning \"L'appel du scriptblock renvoi true\"}
if (&$sbnotNull) {Write-Warning \"L'appel du scriptblock renvoi true\"}
#AVERTISSEMENT : L'appel du scriptblock renvoi true
[/code:1]
On peut regrouper les scripblocks dans une hashtable
[code:1]
$Filtres=@{
Ip={$_.CallerMAC -eq $Data};
Date={$_.SetupTime -eq $Data};
IpOrDate={$_.CallerMAC -eq $Data[0] -or $_.SetupTime -eq $Data[1]}
}
$Tab|Where-LogProperty $Filtres.Ip \"10.72.48.134\"
$Tab|Where-LogProperty $Filtres.Ip $MyIP
$Tab|Where-LogProperty $Filtres.Date $MyDate
$Tab|Where-LogProperty $Filtres.IpOrDate $MyIP,$MyDate
[/code:1]
Vérifie si cela répond à ton besoin et ou à tes données.
Il se peut qu'une recherche à l'aide de regex dans le fichier texte d'origine soit plus rapide voir utiliser une table Access(SQL), je te laisse tester.
Si je me souviens bien on peut créer des tables Access sans devoir l'installer (via ADO)...<br><br>Message édité par: Laurent Dardenne, à: 29/09/10 14:33
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- crouzille
- Auteur du sujet
- Hors Ligne
- Membre junior
-
Réduire
Plus d'informations
- Messages : 34
- Remerciements reçus 0
il y a 15 ans 5 mois #7877
par crouzille
Réponse de crouzille sur le sujet Re:Filtre tableau
Merci Laurent j'ai procéder comme suit:
[code:1]Filter Where-LogProperty($Property,$Data) {if ($_.\"$Property\" -match $Data) {$_}}
$call_log = $Tab|Where-LogProperty \"CallerMAC\" \"10.72.48.134\"
$call_log2 = $call_log|Where-LogProperty \"SetupTime\" \"2010-08-29\"
[/code:1]
Par contre je n'ai pas compris cette ligne:
[code:1]
Filter Where-LogProperty($Property,$Data) {if ($_.\"$Property\" -match $Data) {$_}}
[/code:1]
Pourrait tu me l'expliquer?
Merci beaucoup pour ton aide
[code:1]Filter Where-LogProperty($Property,$Data) {if ($_.\"$Property\" -match $Data) {$_}}
$call_log = $Tab|Where-LogProperty \"CallerMAC\" \"10.72.48.134\"
$call_log2 = $call_log|Where-LogProperty \"SetupTime\" \"2010-08-29\"
[/code:1]
Par contre je n'ai pas compris cette ligne:
[code:1]
Filter Where-LogProperty($Property,$Data) {if ($_.\"$Property\" -match $Data) {$_}}
[/code:1]
Pourrait tu me l'expliquer?
Merci beaucoup pour ton aide
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 5 mois #7879
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Filtre tableau
noir28 écrit:
$Property contient le nom d'une propriété, permet de construire un appel dynamique.
$Data contient la ou les données à tester dans le filtre, comme on ne type pas la variable on peut passer un objet ou un tableau.
Le $_ est l'objet courant que l'on doit réémettre dans le pipe si le test réussi.
Le -match indique une recherche par expression régulière, le mieux serait d'échapper les métacaractères \"10\.72\.48\.134\", car selon les cas tu risques de fausser le résultat.<br><br>Message édité par: Laurent Dardenne, à: 1/10/10 12:08
Pour la différence filtre/fonction voir ce tutoriel .Par contre je n'ai pas compris cette ligne:
$Property contient le nom d'une propriété, permet de construire un appel dynamique.
$Data contient la ou les données à tester dans le filtre, comme on ne type pas la variable on peut passer un objet ou un tableau.
Le $_ est l'objet courant que l'on doit réémettre dans le pipe si le test réussi.
Le -match indique une recherche par expression régulière, le mieux serait d'échapper les métacaractères \"10\.72\.48\.134\", car selon les cas tu risques de fausser le résultat.<br><br>Message édité par: Laurent Dardenne, à: 1/10/10 12:08
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.071 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- [Résolu] Filtre tableau