Question
Comparer des lignes dans un csv
- wartraxx
- Auteur du sujet
- Hors Ligne
- Nouveau membre
Réduire
Plus d'informations
- Messages : 9
- Remerciements reçus 0
il y a 8 ans 2 mois #21436
par wartraxx
Comparer des lignes dans un csv a été créé 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
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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6300
- Remerciements reçus 68
il y a 8 ans 2 mois #21440
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Comparer des lignes dans un csv
Salut,
peux-tu préciser l'objectif ?
peux-tu préciser l'objectif ?
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- wartraxx
- Auteur du sujet
- Hors Ligne
- Nouveau membre
Réduire
Plus d'informations
- Messages : 9
- Remerciements reçus 0
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
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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6300
- Remerciements reçus 68
il y a 8 ans 2 mois #21443
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Comparer des lignes dans un csv
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
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.
- wartraxx
- Auteur du sujet
- Hors Ligne
- Nouveau membre
Réduire
Plus d'informations
- Messages : 9
- Remerciements reçus 0
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
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Entraide pour les débutants
- Comparer des lignes dans un csv