Question
Comparaison avancée de 2 fichiers
- Spama
- Auteur du sujet
- Visiteur
-
il y a 13 ans 7 mois #12756
par Spama
Comparaison avancée de 2 fichiers a été créé par Spama
Bonjour à tous,
j'ai une problématique qui me semblait simple au début et qui ne l'est, en fait pas du tout..
ALors à la base j'ai 2 fichiers excel qui ont une structure identique
Nom Serveur - Statut - Composant 1 - Composant 2 - ... - Composant 8
La valeur des composants est un booléen, TRUE si le composant est installé, FALSE si le composant n'est pas présent.
Les 2 fichiers sont une liste de serveurs, certains sont présents dans les 2 fichiers, les valeurs peuvent alors concorder ou bien différer pour un composant
Un serveur peut etre absent du fichier 1 ou bien du fichier 2.
J'ai deja mis en place un script qui va vérifier chaque ligne des fichiers en s'assurant bien que le nom de serveur soir identique (pr pas comparer 2 serveurs différents)
voici le code :
[code:1]$serversA = @{} #Création tableau qui va stocker le fichier 1
$serversB = @{} #Création tableau qui va stocker fichier 2
Import-Csv -delimiter \";\" C:\sid.csv -header \"Server\",\"OSSupport level\",\"Server Status\", \"RIS\",\"PRINT\",\"SavNetApp\", \"Segup\", \"IAS\",\"SCCM\",\"RODC\"| ForEach-Object {$serversA[$_.Server] = $_} # Chaque entree du fichier 1 va etre stocké dans le tableau A avbec le nom de serveur comme index
Import-Csv -delimiter \";\" C:\web.csv -header \"Server\",\"OSSupport level\",\"Server Status\", \"RIS\",\"PRINT\",\"SavNetApp\", \"Segup\", \"IAS\",\"SCCM\",\"RODC\"| ForEach-Object {$serversB[$_.Server] = $_}
foreach ($server in $serversA.Keys | Sort-Object) {
if (($serversB.ContainsKey($server)) -and (Compare-Object $serversA.keys $serversB.keys))
{
if ($serversA[$server].Comp1 -ne $serversB[$server].Comp1)
{
$server
write-host \"diff\" + \" \" \"SID\" :\" \" $serversA[$server].Comp1 \" \" \"web\" : \" \" $serversB[$server].Comp1
}
}
}
[/code:1]
Pour le moment je choisis manuellement le composant a vérifier ( $serversA[$server].comp1 -ne $serversB[$server].comp1 ==> ici le composant 1 )
mais l'affichage de sortie est une horreur et en fait je souhaite que au fur et a mesure de la bouche
chaque serveur qui a des valeurs differentes dans les 2 fichiers soit enregistré dans un fichier.XLS ou bien .CSV
Exple: Serveur - fichierA Comp1 -FichierB Comp1 -FichierA comp2 -FichierB comp2, ....
pour cela j'ai pensé passé par créer un nouvel objet :
[code:1]$Comp1= New-Object PSObject |
Add-Member -Name Server -MemberType NoteProperty -Value \" \" -PassThru
Add-Member -Name FichierA -MemberType NoteProperty -Value \" \" -PassThru
Add-Member -Name FichierB -MemberType NoteProperty -Value \" \" -PassThru
[/code:1]
et je voudrais remplir ce beau tableau avec quelque chose comme ça : [code:1]$comp1[$server].Server = $serversA.Keys [/code:1]
mais c amarche pas top...
j'ai essayé de voir avec une fonction [code:1]function Remplir_objet {
$Comp1=@{
Server = \"Server Name\";
FichierA = \" True/false\";
FichierB = \" True/false\";
}
return New-Object PsObject -property $comp1
}[/code:1]
mais ca ne marche pas.
là je suis un peu perdu, je ne sais plus où chercher.
LEs structures sont une bonne idée ? faut bien créer un objet ?
le cmdlet export-csv ne marche pas :/
Merci d'avance a ceux qui peuvent m'aider ou bien m'aiguiller
bonne journée<br><br>Message édité par: Spama, à: 24/09/12 15:20
j'ai une problématique qui me semblait simple au début et qui ne l'est, en fait pas du tout..
ALors à la base j'ai 2 fichiers excel qui ont une structure identique
Nom Serveur - Statut - Composant 1 - Composant 2 - ... - Composant 8
La valeur des composants est un booléen, TRUE si le composant est installé, FALSE si le composant n'est pas présent.
Les 2 fichiers sont une liste de serveurs, certains sont présents dans les 2 fichiers, les valeurs peuvent alors concorder ou bien différer pour un composant
Un serveur peut etre absent du fichier 1 ou bien du fichier 2.
J'ai deja mis en place un script qui va vérifier chaque ligne des fichiers en s'assurant bien que le nom de serveur soir identique (pr pas comparer 2 serveurs différents)
voici le code :
[code:1]$serversA = @{} #Création tableau qui va stocker le fichier 1
$serversB = @{} #Création tableau qui va stocker fichier 2
Import-Csv -delimiter \";\" C:\sid.csv -header \"Server\",\"OSSupport level\",\"Server Status\", \"RIS\",\"PRINT\",\"SavNetApp\", \"Segup\", \"IAS\",\"SCCM\",\"RODC\"| ForEach-Object {$serversA[$_.Server] = $_} # Chaque entree du fichier 1 va etre stocké dans le tableau A avbec le nom de serveur comme index
Import-Csv -delimiter \";\" C:\web.csv -header \"Server\",\"OSSupport level\",\"Server Status\", \"RIS\",\"PRINT\",\"SavNetApp\", \"Segup\", \"IAS\",\"SCCM\",\"RODC\"| ForEach-Object {$serversB[$_.Server] = $_}
foreach ($server in $serversA.Keys | Sort-Object) {
if (($serversB.ContainsKey($server)) -and (Compare-Object $serversA.keys $serversB.keys))
{
if ($serversA[$server].Comp1 -ne $serversB[$server].Comp1)
{
$server
write-host \"diff\" + \" \" \"SID\" :\" \" $serversA[$server].Comp1 \" \" \"web\" : \" \" $serversB[$server].Comp1
}
}
}
[/code:1]
Pour le moment je choisis manuellement le composant a vérifier ( $serversA[$server].comp1 -ne $serversB[$server].comp1 ==> ici le composant 1 )
mais l'affichage de sortie est une horreur et en fait je souhaite que au fur et a mesure de la bouche
chaque serveur qui a des valeurs differentes dans les 2 fichiers soit enregistré dans un fichier.XLS ou bien .CSV
Exple: Serveur - fichierA Comp1 -FichierB Comp1 -FichierA comp2 -FichierB comp2, ....
pour cela j'ai pensé passé par créer un nouvel objet :
[code:1]$Comp1= New-Object PSObject |
Add-Member -Name Server -MemberType NoteProperty -Value \" \" -PassThru
Add-Member -Name FichierA -MemberType NoteProperty -Value \" \" -PassThru
Add-Member -Name FichierB -MemberType NoteProperty -Value \" \" -PassThru
[/code:1]
et je voudrais remplir ce beau tableau avec quelque chose comme ça : [code:1]$comp1[$server].Server = $serversA.Keys [/code:1]
mais c amarche pas top...
j'ai essayé de voir avec une fonction [code:1]function Remplir_objet {
$Comp1=@{
Server = \"Server Name\";
FichierA = \" True/false\";
FichierB = \" True/false\";
}
return New-Object PsObject -property $comp1
}[/code:1]
mais ca ne marche pas.
là je suis un peu perdu, je ne sais plus où chercher.
LEs structures sont une bonne idée ? faut bien créer un objet ?
le cmdlet export-csv ne marche pas :/
Merci d'avance a ceux qui peuvent m'aider ou bien m'aiguiller
bonne journée<br><br>Message édité par: Spama, à: 24/09/12 15:20
Connexion ou Créer un compte pour participer à la conversation.
- xyz
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 69
il y a 13 ans 7 mois #12757
par xyz
Tutoriels PowerShell
Réponse de xyz sur le sujet Re:Comparaison avancée de 2 fichiers
Salut,
peux-tu nous donner un jeu de test ?
Et préciser ton objectif, car je n'ai pas compris ton traitement.
peux-tu nous donner un jeu de test ?
Et préciser ton objectif, car je n'ai pas compris ton traitement.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Spama
- Auteur du sujet
- Visiteur
-
il y a 13 ans 7 mois #12758
par Spama
Réponse de Spama sur le sujet Re:Comparaison avancée de 2 fichiers
Hi !
Voici un jeu de test
Fichier A (constitué d'neviron 500 lignes)
Server -- Status -- Comp1 -- Comp2 -- Comp3 -- comp8
ausrv01 -- 1 -- TRUE -- TRUE -- FALSE -- TRUE
ausrv02 --1 --TRUE -- TRUE -- FALSE --TRUE
sdsrv04 -- 1 --TRUE -- TRUE -- FALSE --TRUE
Fichier B (constitué d'environ 400 lignes)
Server -- Status -- Comp1 -- Comp2 -- Comp3 --comp8
ausrv01 -- -FALSE -- TRUE -- FALSE -- TRUE
sdsrv04 -- 1 --TRUE -- FALSE -- TRUE -- TRUE
Mon objectif est de comparer les infos d'un serveur dans 2 fichiers.
Par exemple pour ausrv01 Faire ressortir que l'information du Comp1 diffère dans les 2 fichiers.
En parallèle à cela je dois gérer le fait que sur une meme ligne le nom des serveurs peut etre différent, la ligne 2 du fichier 1 fait référence à ausrv02 alors que la ligne 2 du fichier B fait référence à sdsrv04
Donc dans un premier temps je vérifie que je comparer bien le même serveur dans chacun des fichiers.
Ensuite pour le résultat de la comparaison j'essaye de lui faire prendre la forme suivante :
Test du composant 1 :
Serveur FichierA Comp1 FichierB Comp1
ausrv01 TRUE FALSE
Test du composant 2
Serveur FichierA Comp2 FichierB Comp2
sdsrv04 TRUE FALSE
Comme ça en un coup d'oeil je sais par composant :
- Quel est le serveur concerné,
- Quel est l'information erronée
Tout cela pour pouvoir rapidement faire la mise a jour d'un des 2 fichiers.
Je partais de l'idée de comparer les 2 fichiers en passant par des tableaux dans lesquel$s j'importe chacun de mes .CSV et je remplis un 3eme tableau avec le Nom du serveur comparé, la valeur du composant dans le fichier A et celle du Fichier B.
j'espere que je suis clair...
Je suis aidé par le Livre PowerShell 1 et 2. Mais là je suis perdu dans mon organisation, dois je continuer du coté des \"structures\", vers la création d'objet ? ....
Message édité par: Spama, à: 24/09/12 17:05
Message édité par: Spama, à: 24/09/12 17:08<br><br>Message édité par: Spama, à: 24/09/12 17:08
Voici un jeu de test
Fichier A (constitué d'neviron 500 lignes)
Server -- Status -- Comp1 -- Comp2 -- Comp3 -- comp8
ausrv01 -- 1 -- TRUE -- TRUE -- FALSE -- TRUE
ausrv02 --1 --TRUE -- TRUE -- FALSE --TRUE
sdsrv04 -- 1 --TRUE -- TRUE -- FALSE --TRUE
Fichier B (constitué d'environ 400 lignes)
Server -- Status -- Comp1 -- Comp2 -- Comp3 --comp8
ausrv01 -- -FALSE -- TRUE -- FALSE -- TRUE
sdsrv04 -- 1 --TRUE -- FALSE -- TRUE -- TRUE
Mon objectif est de comparer les infos d'un serveur dans 2 fichiers.
Par exemple pour ausrv01 Faire ressortir que l'information du Comp1 diffère dans les 2 fichiers.
En parallèle à cela je dois gérer le fait que sur une meme ligne le nom des serveurs peut etre différent, la ligne 2 du fichier 1 fait référence à ausrv02 alors que la ligne 2 du fichier B fait référence à sdsrv04
Donc dans un premier temps je vérifie que je comparer bien le même serveur dans chacun des fichiers.
Ensuite pour le résultat de la comparaison j'essaye de lui faire prendre la forme suivante :
Test du composant 1 :
Serveur FichierA Comp1 FichierB Comp1
ausrv01 TRUE FALSE
Test du composant 2
Serveur FichierA Comp2 FichierB Comp2
sdsrv04 TRUE FALSE
Comme ça en un coup d'oeil je sais par composant :
- Quel est le serveur concerné,
- Quel est l'information erronée
Tout cela pour pouvoir rapidement faire la mise a jour d'un des 2 fichiers.
Je partais de l'idée de comparer les 2 fichiers en passant par des tableaux dans lesquel$s j'importe chacun de mes .CSV et je remplis un 3eme tableau avec le Nom du serveur comparé, la valeur du composant dans le fichier A et celle du Fichier B.
j'espere que je suis clair...
Je suis aidé par le Livre PowerShell 1 et 2. Mais là je suis perdu dans mon organisation, dois je continuer du coté des \"structures\", vers la création d'objet ? ....
Message édité par: Spama, à: 24/09/12 17:05
Message édité par: Spama, à: 24/09/12 17:08<br><br>Message édité par: Spama, à: 24/09/12 17:08
Connexion ou Créer un compte pour participer à la conversation.
- SiSMik
- Hors Ligne
- Membre platinium
-
Réduire
Plus d'informations
- Messages : 492
- Remerciements reçus 0
il y a 13 ans 7 mois #12766
par SiSMik
Réponse de SiSMik sur le sujet Re:Comparaison avancée de 2 fichiers
Bonjour,
Un truc tout bête mais à tu essayer Compare-Object ?
[code:1]
$a = Import-Csv -delimiter \";\" C:\sid.csv -header \"Server\",\"OSSupport level\",\"Server Status\", \"RIS\",\"PRINT\",\"SavNetApp\", \"Segup\", \"IAS\",\"SCCM\",\"RODC\"
$b = Import-Csv -delimiter \";\" C:\web.csv -header \"Server\",\"OSSupport level\",\"Server Status\", \"RIS\",\"PRINT\",\"SavNetApp\", \"Segup\", \"IAS\",\"SCCM\",\"RODC\"
Compare-Objet $a $b
[/code:1]
ça devrait répondre en partie à ton problème, reste à traiter les lignes retournées, mais ça vu que j'ai pas tout compris à ce que tu veux faire, je te le laisse
Un truc tout bête mais à tu essayer Compare-Object ?
[code:1]
$a = Import-Csv -delimiter \";\" C:\sid.csv -header \"Server\",\"OSSupport level\",\"Server Status\", \"RIS\",\"PRINT\",\"SavNetApp\", \"Segup\", \"IAS\",\"SCCM\",\"RODC\"
$b = Import-Csv -delimiter \";\" C:\web.csv -header \"Server\",\"OSSupport level\",\"Server Status\", \"RIS\",\"PRINT\",\"SavNetApp\", \"Segup\", \"IAS\",\"SCCM\",\"RODC\"
Compare-Objet $a $b
[/code:1]
ça devrait répondre en partie à ton problème, reste à traiter les lignes retournées, mais ça vu que j'ai pas tout compris à ce que tu veux faire, je te le laisse
Connexion ou Créer un compte pour participer à la conversation.
- Spama
- Auteur du sujet
- Visiteur
-
il y a 13 ans 7 mois #12767
par Spama
Réponse de Spama sur le sujet Re:Comparaison avancée de 2 fichiers
Hello !
Oui j'ai essayé compare-object mais j'etais confronté à un problème de sortie
C'est a dire qu'il m'affiche bien qu'il y a une différence avec le \"<=\" ou \"=>\" mais e ne suis pas arrivé a jouer avec la commande pour qu'elle affiche et exporte
le nom du serveur / La valeur affichée dans le fichier A / La valeur affichée dans le fichier B
Je suis désolé de ne pouvoir etre plus clair .. :/
Oui j'ai essayé compare-object mais j'etais confronté à un problème de sortie
C'est a dire qu'il m'affiche bien qu'il y a une différence avec le \"<=\" ou \"=>\" mais e ne suis pas arrivé a jouer avec la commande pour qu'elle affiche et exporte
le nom du serveur / La valeur affichée dans le fichier A / La valeur affichée dans le fichier B
Je suis désolé de ne pouvoir etre plus clair .. :/
Connexion ou Créer un compte pour participer à la conversation.
- SiSMik
- Hors Ligne
- Membre platinium
-
Réduire
Plus d'informations
- Messages : 492
- Remerciements reçus 0
il y a 13 ans 7 mois #12768
par SiSMik
Réponse de SiSMik sur le sujet Re:Comparaison avancée de 2 fichiers
Peut être devriez vous utiliser des macros.
Là je vois ce que vous voulez faire, si j'ai le temps ce soir je regarderais, mais s'il vous plait des vrais extraits de fichiers, car vos exemples ne sont pas au format que vous utilisez pour l'import-csv de vos modules.
Là je vois ce que vous voulez faire, si j'ai le temps ce soir je regarderais, mais s'il vous plait des vrais extraits de fichiers, car vos exemples ne sont pas au format que vous utilisez pour l'import-csv de vos modules.
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.044 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Comparaison avancée de 2 fichiers