Question
[Résolu] Select string / import-csv
- crouzille
- Auteur du sujet
- Hors Ligne
- Membre junior
-
Réduire
Plus d'informations
- Messages : 34
- Remerciements reçus 0
il y a 15 ans 11 mois #6462
par crouzille
[Résolu] Select string / import-csv a été créé par crouzille
Bonjour à tous.
Me voici confronté de nouveau à un problème que je pensais pouvoir résoudre car je l'avais fait auparavant en batch mais je suis pas inspiré en powershell
.
Tout d'abord, je vous explique le concept:
je dispose de deux fichiers .csv
Filtre_IP.csv
ex:
Nom,IP,Lieu
Tony,10.72.52.202,SI
Jeremy,10.72.49.72,SI
Francoise,10.72.52.203,SI
Call_log.csv
ex:
CallId,SetupTime,AlertingTime,ConnectTime,DisconnectTime,Duration,TotalDuration,FileName,CallerIp,CallerPort,CallerMAC,CallerSyncInfo,CallerCodec,CallerPacketsReceived,CallerPacketsLost,CallerPacketsOutOfOrder,CallerPacketsBad,CalleeIp,CalleePort,CalleeMAC,CalleeSyncInfo,CalleeCodec,CalleePacketsReceived,CalleePacketsLost,CalleePacketsOutOfOrder,CalleePacketsBad,FileNameFull
49fcfab900000001,2009-05-03 08:00:27,2009-05-03 08:00:27,2009-05-03 08:00:28,2009-05-03 08:00:29,1,1,,,,10.72.48.174,3012,00-04-0D-F0-FB-3D,,,,10.72.51.81,2492,00-09-6E-10-2D-03,20090503080027.wav,D:\RecordAVAYA\20090503\20090503080027.wav
Mon objectif est de prendre l'ip de chaque personne dans Filtre_IP et d'ensuite avec cette ip la rechercher dans le call_log.csv.
Donc pour l'instant j'ai procédé comme suit:
<#Filtre_IP.ps1
#Ce programme permet à partir d'une liste d'IP, de retrouver les enregistrement dans le call_log et de les supprimer.
#\"Filtre_IP.csv\" >> Fichier de référence pour les IP à prendre en compte
#===========================================================================#
Imporation données
#===========================================================================#
$call_log = \"C:\Documents and Settings\jcr\Bureau\Dossier de test\test.csv\"
$fichier = \"C:\Documents and Settings\jcr\Bureau\Dossier de test\Filtre_IP.csv\"
#la variable \"$var\" est devenu le fichier filtre_IP
$var = import-csv -delimiter ',' $fichier
#On parcours chaques lignes avec i+1
for ($i = 0 ; $i -lt $var.Length - 0 ; $i++)
{
$IP = $var[$i].IP
#Nous cherchons à présent l'IP mise en variable (\"$IP\") dans le call_log
$var2 = $varselect-string -path $call_log -pattern \"$IP\" -casesensitive
}
#>
Donc j'arrive à avoir dans $var2 toutes les lignes ou L'ip est présente. Mais ensuite je bloque car de ces lignes récupérées je souhaite extraire une partie de cette ligne en variable (souligné en gras au dessus)
En batch je procédé avec les partie et délimiteurs.
J'espère avoir etait assez clair dans mes explications.
Quelqu'un pourrai m'éclairé sur le chemin à suivre
Merci beaucoup
<br><br>Message édité par: noir28, à: 1/04/10 12:27
Me voici confronté de nouveau à un problème que je pensais pouvoir résoudre car je l'avais fait auparavant en batch mais je suis pas inspiré en powershell
Tout d'abord, je vous explique le concept:
je dispose de deux fichiers .csv
Filtre_IP.csv
ex:
Nom,IP,Lieu
Tony,10.72.52.202,SI
Jeremy,10.72.49.72,SI
Francoise,10.72.52.203,SI
Call_log.csv
ex:
CallId,SetupTime,AlertingTime,ConnectTime,DisconnectTime,Duration,TotalDuration,FileName,CallerIp,CallerPort,CallerMAC,CallerSyncInfo,CallerCodec,CallerPacketsReceived,CallerPacketsLost,CallerPacketsOutOfOrder,CallerPacketsBad,CalleeIp,CalleePort,CalleeMAC,CalleeSyncInfo,CalleeCodec,CalleePacketsReceived,CalleePacketsLost,CalleePacketsOutOfOrder,CalleePacketsBad,FileNameFull
49fcfab900000001,2009-05-03 08:00:27,2009-05-03 08:00:27,2009-05-03 08:00:28,2009-05-03 08:00:29,1,1,,,,10.72.48.174,3012,00-04-0D-F0-FB-3D,,,,10.72.51.81,2492,00-09-6E-10-2D-03,20090503080027.wav,D:\RecordAVAYA\20090503\20090503080027.wav
Mon objectif est de prendre l'ip de chaque personne dans Filtre_IP et d'ensuite avec cette ip la rechercher dans le call_log.csv.
Donc pour l'instant j'ai procédé comme suit:
<#Filtre_IP.ps1
#Ce programme permet à partir d'une liste d'IP, de retrouver les enregistrement dans le call_log et de les supprimer.
#\"Filtre_IP.csv\" >> Fichier de référence pour les IP à prendre en compte
#===========================================================================#
Imporation données
#===========================================================================#
$call_log = \"C:\Documents and Settings\jcr\Bureau\Dossier de test\test.csv\"
$fichier = \"C:\Documents and Settings\jcr\Bureau\Dossier de test\Filtre_IP.csv\"
#la variable \"$var\" est devenu le fichier filtre_IP
$var = import-csv -delimiter ',' $fichier
#On parcours chaques lignes avec i+1
for ($i = 0 ; $i -lt $var.Length - 0 ; $i++)
{
$IP = $var[$i].IP
#Nous cherchons à présent l'IP mise en variable (\"$IP\") dans le call_log
$var2 = $varselect-string -path $call_log -pattern \"$IP\" -casesensitive
}
#>
Donc j'arrive à avoir dans $var2 toutes les lignes ou L'ip est présente. Mais ensuite je bloque car de ces lignes récupérées je souhaite extraire une partie de cette ligne en variable (souligné en gras au dessus)
En batch je procédé avec les partie et délimiteurs.
J'espère avoir etait assez clair dans mes explications.
Quelqu'un pourrai m'éclairé sur le chemin à suivre
Merci beaucoup
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 11 mois #6463
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Select string / import-csv
noir28 écrit:
Il faut donc le plus souvnet penser objet et pas texte.
Une solution, si le champ CallerMAC contient bien l'IP et que chaque ligne représente un objet :
[code:1]
$Log=import-csv -delimiter ',' \"$pwd\Call_log.csv\"
#regroupe par IP
$Grp=$Log|Group-Object CallerMAC
#nombre de groupe trouvé
$Grp.Count
#nom du groupe, c'est à dire l'adresse IP
$Grp[0].Name
#nombre de lignes pour une IP donnée
$Grp[0].Group.Count
#Liste des fichiers
$Grp[0].Group|Select CalleeSyncinfo
[/code:1]
Ensuite reste à retrouver, via l'ip, le nom associé ( fichier Filtre_IP):
[code:1]
$IP=import-csv -delimiter ',' \"$pwd\ip.csv\"
$H=@{};$IP|% {$H.\"$($_.IP)\"=($_|Select Nom,Lieu)}
$H[($Grp[0].Name)]
#Agathe Thepower !
[/code:1]
A tester
Du texte donc, PowerShell est basé objet.En batch je procédé avec les partie et délimiteurs.
Il faut donc le plus souvnet penser objet et pas texte.
Une solution, si le champ CallerMAC contient bien l'IP et que chaque ligne représente un objet :
[code:1]
$Log=import-csv -delimiter ',' \"$pwd\Call_log.csv\"
#regroupe par IP
$Grp=$Log|Group-Object CallerMAC
#nombre de groupe trouvé
$Grp.Count
#nom du groupe, c'est à dire l'adresse IP
$Grp[0].Name
#nombre de lignes pour une IP donnée
$Grp[0].Group.Count
#Liste des fichiers
$Grp[0].Group|Select CalleeSyncinfo
[/code:1]
Ensuite reste à retrouver, via l'ip, le nom associé ( fichier Filtre_IP):
[code:1]
$IP=import-csv -delimiter ',' \"$pwd\ip.csv\"
$H=@{};$IP|% {$H.\"$($_.IP)\"=($_|Select Nom,Lieu)}
$H[($Grp[0].Name)]
#Agathe Thepower !
[/code:1]
A tester
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 11 mois #6464
par crouzille
Réponse de crouzille sur le sujet Re:Select string / import-csv
Merci pour cette réponse très rapide. 
Je suis encore habitué au batch . Powershell est excellent et très complet. Même trop pour moi
Je n'ai pas compris par contre le dernier bout de code que tu as mis:
[code:1]$IP=import-csv -delimiter ',' \"$pwd\ip.csv\"
$H=@{};$IP|% {$H.\"$($_.IP)\"=($_|Select Nom,Lieu)}
$H[($Grp[0].Name)][/code:1]
Mais sinon cela m'as bien aidé et aiguillé
J'ai testé il marche, le voici si cela peut aider quelqu'un
[code:1]$call_log = \"C:\Documents and Settings\jcr\Bureau\Dossier de test\test2.csv\"
$fichier = \"C:\Documents and Settings\jcr\Bureau\Dossier de test\Filtre_IP.csv\"
#la variable \"$var\" est devenue le fichier filtre_IP
$var = import-csv -delimiter ',' $fichier
#la variable \"$log\" est devenue le fichier call_log
$Log = import-csv -delimiter ',' $call_log
#On parcours chaques lignes de filtre_IP.csv
for ($i = 0 ; $i -lt $var.Length - 0 ; $i++)
{
$IP = $var[$i].IP
# colonne callerMAC
for ($j = 0 ; $j -lt $log.Length - 0 ; $j++)
{
#regroupe par IP
$Grp = $Log | Group-Object CallerMAC
#nom du groupe, c'est à dire l'adresse IP
if ($grp[$j].name -eq $IP)
{
$enregistrement = $Grp[$j].Group | Select CalleeMAC #enregistrement prend pour valeur la ligne \"$j\" , dans le group avec nom de table calleeMAC qui correspond au nom du fichier
$enregistrement
}
}
# colonne callerPacketsBad
for ($k = 0 ; $k -lt $log.Length - 0 ; $k++)
{
#regroupe par IP
$Grp = $Log | Group-Object callerPacketsBad
#nom du groupe, c'est à dire l'adresse IP
if ($grp[$k].name -eq $IP)
{
$enregistrement = $Grp[$k].Group | select CalleeMAC
$enregistrement
}
}
[/code:1]
Merci beaucoup pour l'aide apportée (et c'est pas la première fois
)<br><br>Message édité par: noir28, à: 31/03/10 16:17
Je suis encore habitué au batch . Powershell est excellent et très complet. Même trop pour moi
Je n'ai pas compris par contre le dernier bout de code que tu as mis:
[code:1]$IP=import-csv -delimiter ',' \"$pwd\ip.csv\"
$H=@{};$IP|% {$H.\"$($_.IP)\"=($_|Select Nom,Lieu)}
$H[($Grp[0].Name)][/code:1]
Mais sinon cela m'as bien aidé et aiguillé
J'ai testé il marche, le voici si cela peut aider quelqu'un
[code:1]$call_log = \"C:\Documents and Settings\jcr\Bureau\Dossier de test\test2.csv\"
$fichier = \"C:\Documents and Settings\jcr\Bureau\Dossier de test\Filtre_IP.csv\"
#la variable \"$var\" est devenue le fichier filtre_IP
$var = import-csv -delimiter ',' $fichier
#la variable \"$log\" est devenue le fichier call_log
$Log = import-csv -delimiter ',' $call_log
#On parcours chaques lignes de filtre_IP.csv
for ($i = 0 ; $i -lt $var.Length - 0 ; $i++)
{
$IP = $var[$i].IP
# colonne callerMAC
for ($j = 0 ; $j -lt $log.Length - 0 ; $j++)
{
#regroupe par IP
$Grp = $Log | Group-Object CallerMAC
#nom du groupe, c'est à dire l'adresse IP
if ($grp[$j].name -eq $IP)
{
$enregistrement = $Grp[$j].Group | Select CalleeMAC #enregistrement prend pour valeur la ligne \"$j\" , dans le group avec nom de table calleeMAC qui correspond au nom du fichier
$enregistrement
}
}
# colonne callerPacketsBad
for ($k = 0 ; $k -lt $log.Length - 0 ; $k++)
{
#regroupe par IP
$Grp = $Log | Group-Object callerPacketsBad
#nom du groupe, c'est à dire l'adresse IP
if ($grp[$k].name -eq $IP)
{
$enregistrement = $Grp[$k].Group | select CalleeMAC
$enregistrement
}
}
[/code:1]
Merci beaucoup pour l'aide apportée (et c'est pas la première fois
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 11 mois #6465
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Select string / import-csv
noir28 écrit:
:
[code:1]
#On importe le fichier ip.csv dans une variable qui contiendra un tableau d'objet
$IP=import-csv -delimiter ',' \"$pwd\ip.csv\"
#crée une hashtable (Clé,Valeur)
$H=@{};
# On itère, via le pipeline, sur le tableau d'objets (Nom,IP,Lieu)
#le caractère % est un raccourcis de Foreach-Object.
$IP|
#Pour chaque objet on crée une entrée dans la hashtable
Foreach-Object {
#$($_.IP) permet de renvoyer la propriété IP comme une string
#pouvant être utilisée comme nom de clé.
#
#$_|Select Nom,Lieu -> on ne prend que les membres Nom et Lieu de l'objet
#en cours de traitement dans le pipeline.
# Select-Object construit et renvoi un nouvel objet ayant 2 propriétés.
$H.\"$($_.IP)\"=($_|Select-Object Nom,Lieu)
}
#On récupére le nom associé à l'IP du groupe
#$H[NumIP]=Nom
$H[($Grp[0].Name)] #équivalent à $H.\"1.5.52.78\"
#renvoi (\"Tony\",\"SI\"«»)
$H[($Grp[0].Name)].Nom
#renvoi Tony
[/code:1]
Cela t'évite une boucle de recherche.
Il faut toutefois que le nombre de lignes (d'objets) dans le fichier IP.csv ne soient pas trop important, qq centaines.
Ensuite pour qq milliers faudrait vérifier les temps d'accés
Pour les constructions du type :
[code:1]
$enregistrement = $Grp[$j].Group | Select CalleeMAC
$enregistrement
[/code:1]
tu peux simplifier :
[code:1]
#Emet l'objet dans le pipeline
$Grp[$j].Group | Select CalleeMAC
[/code:1]
Ne sachant pas trop ce que tu manipules dans la seconde boucle, vérifie si le regroupement suivant donnerait le même résultat :
[code:1]
Group-Object CallerMAC,callerPacketsBad
[/code:1]
J'ai comme l'impression que les informations émises sont liées, mais je peux me tromper.
Désolé, j'oublie parfois de fournir quelques explicationsJe n'ai pas compris par contre le dernier bout de code que tu as mis:
[code:1]
#On importe le fichier ip.csv dans une variable qui contiendra un tableau d'objet
$IP=import-csv -delimiter ',' \"$pwd\ip.csv\"
#crée une hashtable (Clé,Valeur)
$H=@{};
# On itère, via le pipeline, sur le tableau d'objets (Nom,IP,Lieu)
#le caractère % est un raccourcis de Foreach-Object.
$IP|
#Pour chaque objet on crée une entrée dans la hashtable
Foreach-Object {
#$($_.IP) permet de renvoyer la propriété IP comme une string
#pouvant être utilisée comme nom de clé.
#
#$_|Select Nom,Lieu -> on ne prend que les membres Nom et Lieu de l'objet
#en cours de traitement dans le pipeline.
# Select-Object construit et renvoi un nouvel objet ayant 2 propriétés.
$H.\"$($_.IP)\"=($_|Select-Object Nom,Lieu)
}
#On récupére le nom associé à l'IP du groupe
#$H[NumIP]=Nom
$H[($Grp[0].Name)] #équivalent à $H.\"1.5.52.78\"
#renvoi (\"Tony\",\"SI\"«»)
$H[($Grp[0].Name)].Nom
#renvoi Tony
[/code:1]
Cela t'évite une boucle de recherche.
Il faut toutefois que le nombre de lignes (d'objets) dans le fichier IP.csv ne soient pas trop important, qq centaines.
Ensuite pour qq milliers faudrait vérifier les temps d'accés
Pour les constructions du type :
[code:1]
$enregistrement = $Grp[$j].Group | Select CalleeMAC
$enregistrement
[/code:1]
tu peux simplifier :
[code:1]
#Emet l'objet dans le pipeline
$Grp[$j].Group | Select CalleeMAC
[/code:1]
Ne sachant pas trop ce que tu manipules dans la seconde boucle, vérifie si le regroupement suivant donnerait le même résultat :
[code:1]
Group-Object CallerMAC,callerPacketsBad
[/code:1]
J'ai comme l'impression que les informations émises sont liées, mais je peux me tromper.
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 11 mois #6466
par crouzille
Réponse de crouzille sur le sujet Re:Select string / import-csv
Merci pour les explications 
C'est vrai que j'ai pas été assez loin dans mes explications
En fait, dans le fichier call_log (fichier de plus de 65000 lignes
) les colonnes callerPacketsBad et CallerMAC sont composé d'IP.
Je dois rechercher dans les deux car une IP peut se trouver dans l'une des deux ( appels sortant ou entrant)
Une fois que j'ai trouvé l'IP je retrouve (grâce à ton aide
) le nom du fichier correspond.
Le nom du fichier est sous cete forme:
ex:
20090503080029.wav
année, mois, jour, heure, minute, seconde.
Ce genre de fichier est stocké dans une partie du disque dur sous des nom de repertoire par rapport a la date du jour.
ex: pour 20090503080029.wav ce dernier est rangé dans un dossier 20090503.
Avec le nom du fichier je sais où ce dernier est stocké.
Ce qui permet ensuite de le copier ou de le supprimé.
à la fin de mon code j'aurais:
[code:1]$enregistrement = $Grp[$k].Group | select CalleeMAC
$MP3 = $enregistrements #pas fini
remove-item c:\$MP3\$enregistrement [/code:1]
la variable MP3 est en faite une partie de la variable enregistrement.c'est pour cela que je garde la variable enregsitrement. je vais essayer ce que tu m'as donné car je suis sur qu'il doit avoir beaucoup plus simple que ce que j'ai mis en place
Sais tu par hasard quelle est l'équivalent en powershell de:
MP3=%enregistrement:~0,8%
(batch
) ...
jérémy<br><br>Message édité par: noir28, à: 1/04/10 12:23
C'est vrai que j'ai pas été assez loin dans mes explications
En fait, dans le fichier call_log (fichier de plus de 65000 lignes
Je dois rechercher dans les deux car une IP peut se trouver dans l'une des deux ( appels sortant ou entrant)
Une fois que j'ai trouvé l'IP je retrouve (grâce à ton aide
Le nom du fichier est sous cete forme:
ex:
20090503080029.wav
année, mois, jour, heure, minute, seconde.
Ce genre de fichier est stocké dans une partie du disque dur sous des nom de repertoire par rapport a la date du jour.
ex: pour 20090503080029.wav ce dernier est rangé dans un dossier 20090503.
Avec le nom du fichier je sais où ce dernier est stocké.
Ce qui permet ensuite de le copier ou de le supprimé.
à la fin de mon code j'aurais:
[code:1]$enregistrement = $Grp[$k].Group | select CalleeMAC
$MP3 = $enregistrements #pas fini
remove-item c:\$MP3\$enregistrement [/code:1]
la variable MP3 est en faite une partie de la variable enregistrement.c'est pour cela que je garde la variable enregsitrement. je vais essayer ce que tu m'as donné car je suis sur qu'il doit avoir beaucoup plus simple que ce que j'ai mis en place
Sais tu par hasard quelle est l'équivalent en powershell de:
MP3=%enregistrement:~0,8%
(batch
jérémy<br><br>Message édité par: noir28, à: 1/04/10 12:23
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 11 mois #6467
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Select string / import-csv
noir28 écrit:
$MP3=$Enregistrement.Substring(0,8)
[/code:1]
[code:1]Sais tu par hasard quelle est l'équivalent en powershell de:
[code:1] set MP3=%enregistrement:~0,8%[/code:1]
$MP3=$Enregistrement.Substring(0,8)
[/code:1]
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.053 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- [Résolu] Select string / import-csv