Question Comparer des lignes dans un csv

Plus d'informations
il y a 8 ans 2 mois #21436 par wartraxx
Bonjour à tous,


J'ai un csv avec 3 colonnes
Name Host Datastore
BDD1 ESX1 TOTO1
BDD2 ESX2 TOTO4
BDD3 ESX1 TOTO2
etc.. etc.. etc...

Je voulais savoir comment faire pour comparer les valeurs Host et datastore entre les machines que je sélectionne comme BDD1 et BDD2 ou BDD2 et BDD3

Merci de votre aide

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

Plus d'informations
il y a 8 ans 2 mois #21440 par Laurent Dardenne
Salut,
peux-tu préciser l'objectif ?

Tutoriels PowerShell

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

Plus d'informations
il y a 8 ans 2 mois #21441 par wartraxx
Réponse de wartraxx sur le sujet Re:Comparer des lignes dans un csv
L'objectif:

c'est de pouvoir comparer les colonnes Host et datastore en sélectionnant deux \"Name\" ou plus dans le fichier csv . Si elles ont les mêmes données dans les colonnes host, ça doit me retourner une erreur et aussi si elles ont le même datastore, ça doit me retourner une erreur

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

Plus d'informations
il y a 8 ans 2 mois #21443 par Laurent Dardenne
Pas évident !
Une solution basée sur Group-Object ( testé sous PS v4 x64) :
[code:1]
#Enumération tableau de bits
Add-type -TypeDefinition @'
using System;

namespace VM {
[Flags]
public enum ConfigurationState
{
Different = 0x00,
HostDuplicate= 0x01,
DtsDuplicate= 0x02
}
}
'@
[/code:1]
Création et lecture d'un jeux de tests :
[code:1]
$file='c:\temp\datas.csv'
@'
Name;Host;Datastore
BDD1;ESX1;DTS1
BDD2;ESX1;DTS1
BDD3;ESX1;DTS2
BDD4;ESX2;DTS1
BDD5;ESX3;DTS3
'@ > $File

$Datas=Import-csv $File -Delimiter ';'

#Ajoute une propriété typée
#L'objet contient désormais les propriétés : Name;Host;Datastore;Reason
$Datas|
Foreach {
Add-member -Input $_ -Name 'Reason' -MemberType NoteProperty -Value ([VM.ConfigurationState]::«»Different)
}
$Datas
# Name Host Datastore Reason
# ---- ----

# BDD1 ESX1 DTS1 Different
# ...
[/code:1]
Démo du principe, ne fait pas partie du traitement :
[code:1]
#Jeux de test des différents cas
#Ne modifie pas le contenu de la propriété Reason
$Tests=@{
HostAndDtsEqual=@('BDD1','BDD2')
HostEqual=@('BDD1','BDD3')
DtsEqual=@('BDD1','BDD4')
NotEqual=@('BDD1','BDD5')
}

$Tests.GetEnumerator() |
Foreach {
$Current=$_
Write-Warning \"Traite $($Current.Key)\"

Write-Warning \"`tRecherche les doublons de Host\"
$Datas|
Where {$_.Name -in $Current.Value}|
Group -Property Host|Sort Count

Write-Warning \"`tRecherche les doublons de Datastore\"
$Datas|
Where {$_.Name -in $Current.Value}|
Group -Property DataStore|Sort Count
}

Write-Warning \"Recherche tous les doublons de Host\"
$GrpHost=$Datas|
Group -Property Host|Sort Count
$GrpHost

Write-Warning \"Recherche tous les doublons de Datastore\"
$GrpDts=$Datas|
Group -Property DataStore|Sort Count
$GrpDts
[/code:1]
La seconde partie du traitement, effectué en deux passes sur l'intégralité de la collection :
[code:1]
#Annule et remplace le contenu de la propriété Reason
$Datas|
Group -Property Host|
Where {$_.Count -gt 1}|
Foreach {
$_.Group|
Foreach {
$_.Reason=[VM.ConfigurationState]([VM.ConfigurationState]::HostDuplicate)
}
}

#Compléte le contenu de la propriété Reason
$Datas|
Group -Property DataStore|
Where {$_.Count -gt 1}|
Foreach {
$_.Group|
Foreach {
$_.Reason = [VM.ConfigurationState]($_.Reason -bor [VM.ConfigurationState]::«»DtsDuplicate)
}
}

#Résultat. La collection d'origine est modifiée
$Datas
# Name Host Datastore Reason
# ---- ----

# BDD1 ESX1 DTS1 HostDuplicate, DtsDuplicate
# BDD2 ESX1 DTS1 HostDuplicate, DtsDuplicate
# BDD3 ESX1 DTS2 HostDuplicate
# BDD4 ESX2 DTS1 DtsDuplicate
# BDD5 ESX3 DTS3 Different

#Affichages de filtre
$datas|Where {$_.reason -eq \"HostDuplicate,DtsDuplicate\"}
$datas|Where {$_.reason -ne \"Different\"}
[/code:1]
Le nommage des états est surement à revoir :-)<br><br>Message édité par: Laurent Dardenne, à: 28/01/16 19:39

Tutoriels PowerShell

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

Plus d'informations
il y a 8 ans 1 mois #21453 par wartraxx
Réponse de wartraxx sur le sujet Re:Comparer des lignes dans un csv
Je te remercie pour ton aide.

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

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