Question [Résolu] Select string / import-csv

Plus d'informations
il y a 15 ans 11 mois #6462 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 :ohmy:

Merci beaucoup :)<br><br>Message édité par: noir28, à: 1/04/10 12:27

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

Plus d'informations
il y a 15 ans 11 mois #6463 par Laurent Dardenne
noir28 écrit:

En batch je procédé avec les partie et délimiteurs.

Du texte donc, PowerShell est basé objet.
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 ',' \&quot;$pwd\Call_log.csv\&quot;

#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 ',' \&quot;$pwd\ip.csv\&quot;
$H=@{};$IP|% {$H.\&quot;$($_.IP)\&quot;=($_|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.

Plus d'informations
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 :P

Je n'ai pas compris par contre le dernier bout de code que tu as mis:
[code:1]$IP=import-csv -delimiter ',' \&quot;$pwd\ip.csv\&quot;
$H=@{};$IP|% {$H.\&quot;$($_.IP)\&quot;=($_|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 = \&quot;C:\Documents and Settings\jcr\Bureau\Dossier de test\test2.csv\&quot;
$fichier = \&quot;C:\Documents and Settings\jcr\Bureau\Dossier de test\Filtre_IP.csv\&quot;

#la variable \&quot;$var\&quot; est devenue le fichier filtre_IP
$var = import-csv -delimiter ',' $fichier


#la variable \&quot;$log\&quot; 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 \&quot;$j\&quot; , 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 :lol: )<br><br>Message édité par: noir28, à: 31/03/10 16:17

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

Plus d'informations
il y a 15 ans 11 mois #6465 par Laurent Dardenne
noir28 écrit:

Je n'ai pas compris par contre le dernier bout de code que tu as mis:

Désolé, j'oublie parfois de fournir quelques explications :pinch: :
[code:1]
#On importe le fichier ip.csv dans une variable qui contiendra un tableau d'objet
$IP=import-csv -delimiter ',' \&quot;$pwd\ip.csv\&quot;
#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 -&gt; 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.\&quot;$($_.IP)\&quot;=($_|Select-Object Nom,Lieu)
}
#On récupére le nom associé à l'IP du groupe
#$H[NumIP]=Nom
$H[($Grp[0].Name)] #équivalent à $H.\&quot;1.5.52.78\&quot;
#renvoi (\&quot;Tony\&quot;,\&quot;SI\&quot;«»)
$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.

Plus d'informations
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 :unsure:

En fait, dans le fichier call_log (fichier de plus de 65000 lignes :woohoo: ) 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 :P


Sais tu par hasard quelle est l'équivalent en powershell de:

MP3=%enregistrement:~0,8%

(batch :whistle: ) ...


jérémy<br><br>Message édité par: noir28, à: 1/04/10 12:23

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

Plus d'informations
il y a 15 ans 11 mois #6467 par Laurent Dardenne
noir28 écrit:

Sais tu par hasard quelle est l'équivalent en powershell de:
[code:1] set MP3=%enregistrement:~0,8%[/code:1]

[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
Propulsé par Kunena