Il semble qu'il n'y ai que des modifications entre tes deux fichier ? Est ce vrai ?
Version imprimable
Il semble qu'il n'y ai que des modifications entre tes deux fichier ? Est ce vrai ?
Oui effectivement il n'y avait que des modifications entre les deux fichier d'exemple, je viens de tester avec ma base RH sa fonctionne et traité en même pas 5 secondes :p Tu ma vachement aidé pour le coup car je vais pouvoir avancer sur le script !
Il faut maintenant que je m'attaque à archiver les deux fichier de comparaisons et les renommer dans un dossier d'archive qui est épuré tous les 30 jours. Et ajouter une condition d'import afin de ne traiter l'import si il y a au minimum 1000 lignes dans les fichiers afin d'éviter d'importer une erreur en amont du système RH.
Grandement merci :)
Oui la ça déchire :mrgreen:
Oui la c'est le top du top ericlm128 !
J'aurais aimé rajouter une condition dans le script je m'explique :
Je souhaite vérifier avant l'export que le résultat comporté dans la colonne D soit dans une liste métier. Si ils le sont les résultats compris dans cette liste sont exporter dans le fichier extrationrésultatvrai.csv et si ils le sont pas dans extractionrésultatfaux.csv. J'ai fais un petit schéma :
Pièce jointe 509664
J'ai corrigé la photo dans le commentaire d'avant j'ai fais une erreur.. :p
Comme ceci je pense
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 # Définition des en-têtes $Header = 'A', 'B', 'C', 'D', 'E' # Import des fichiers $F1 = Import-Csv -Path "Fichier10.txt" -Encoding Default -Header $Header -Delimiter ";" $F2 = Import-Csv -Path "Fichier11.txt" -Encoding Default -Header $Header -Delimiter ";" $ListeMetier = Get-Content -Path "listemetier.txt" -Encoding Default # Variable qui servira à stocker le résultat $result = @() # Récupère les différences d'ID (ajout, suppression) # Et stock dans $F1 et $F2 le statut SideIndicator pour les objects découverts, via le paramètre PassThru $result = (Compare-Object -ReferenceObject $F1 -DifferenceObject $F2 -Property A -PassThru) | Select-Object A, B, C, D, E, @{Label="Code d'action";Expression={if($_.SideIndicator -eq "=>"){0}else{2}}} # Récupère les modifications pour les doublons d'ID en comparant toutes les propriétés (A, B, C, D, E) $result += (Compare-Object -ReferenceObject @($F1 | Where-Object {$_.SideIndicator -eq $null}) -DifferenceObject @($F2 | Where-Object {$_.SideIndicator -eq $null}) -Property A, B, C, D, E -ErrorAction SilentlyContinue) | Where-Object {$_.SideIndicator -eq "=>"} | Select-Object A, B, C, D, E, @{Label="Code d'action";Expression={1}} # Identifie le travail métier et trie les résultats $result = $result | Select-Object *, @{Label="IsMetier";Expression={if($ListeMetier -contains $_.D){$true}else{$false}}} | Sort-Object -Property "Code d'action" -Descending # Export $result | Where-Object {$_.IsMetier} | Select-Object A, B, C, D, E, "Code d'action" | Export-Csv -Path "extrationrésultatvrai.csv" -NoTypeInformation -Encoding Default $result | Where-Object {!$_.IsMetier} | Select-Object A, B, C, D, E, "Code d'action" | Export-Csv -Path "extractionrésultatfaux.csv" -NoTypeInformation -Encoding Default
Un énorme et grand MERCI vous m'avez fait gagné encore un temps précieux ! Mes compétences en dev et script n'est pas au top :/
Me revoilà !
J'ai adapté le script en revanche je rencontre une problématique car j'ai remplacer l'import de F2 csv par des données issues d'une base SQL soit cette commande :
par cette commande :Code:$F2 = Import-Csv -Path "Fichier11.txt" -Encoding Default -Header $Header -Delimiter ";"
Code:$F2 = Invoke-Sqlcmd -Query "SELECT A, B, C, D, E, F, G, H, I, J FROM [BDD01].[BDD01].[T_F2] " -ServerInstance "XXXXX" -Database "XXXXX" | Sort-Object -Property A, B, C, D, E, F, G, H, I, J
Cette commande fonctionne parfaitement en revanche je rencontre une problématique pour l'import des listes métiers par des données issues d'une base SQL soit cette commande :
par cette commande :Code:$ListeMetier = Get-Content -Path "listemetier.txt" -Encoding Default
Code:$ListeMetier = Invoke-Sqlcmd -Query "SELECT AA FROM [BDD01].[BDD01].[T_LISTEMETIER]" -ServerInstance "XXXXX" -Database "XXXXX" | Sort-Object -Property AA
Le problème c'est que l'identification du travail métier et trie les résultats met tous les résultats dans l'export Where-Object {!$_.IsMetier}.
Comment peut-on faire pour résoudre cela ?
Merci d'avance
Tu doit vérifier le contenu de $ListeMetier et le nombre d'élément qu'il contient.
Et entre les deux commandes n'oublie pas que tu as ceci qui identifie le travail métier :
Code:
1
2 # Identifie le travail métier et trie les résultats $result = $result | Select-Object *, @{Label="IsMetier";Expression={if($ListeMetier -contains $_.D){$true}else{$false}}} | Sort-Object -Property "Code d'action" -Descending
Merci effectivement il fallait modifier également la commande que tu cite par cela :
Code:
1
2
3
4
5
6 $result = $result | Select-Object *, @{ Label = "IsAlias"; Expression = { if (($ListeMetier.AA -contains $_.I)) { $true } else { $false } } } | Sort-Object -Property "Code d'action" -Descending
Je dois également vérifier si dans la colonne D contient le mot "Caissière" j'ajoute dans la colonne F le mot "Magasin" mais je ne sais pas comment je peut l'intégrer au script
Pièce jointe 513416
Il suffit d'ajouter une colonne F à select-object au bonne endroit :
Code:@{Label="F";Expression={if("Caissière" -eq $_.E){"Magasin"}else{""}}}
Mais nous l'avons déjà fait plusieurs fois. Il faut comprendre le principe, tu devrait avoir tout ce qu'il te faut pour le faire.
Bonjour, je remonte ce sujet, car il m'aide beaucoup.
Sur cette dernière ligne droite, je m'appuie sur ce bout de code qui ne sort que les lignes modifiées. J'ai gardé cette dernière pour les besoins, mais j'aimerais également garder celles identiques et tout comme "Modifier" identifier aussi dans "CODE_MV" celle identique. :) ( {Label="CODE_MV";Expression={"Egale"}} )
Code:
1
2
3
4
5
6
7
8
9
10
11
12 # Définition des en-têtes $Header = 'CODE_MV', 'A', 'B', 'C', 'D', 'E' $result = @() # Import des fichiers $F1 = Import-Csv -Path "C:\Plop\R2.csv" -Encoding Default -Header $Header -Delimiter ";" $F2 = Import-Csv -Path "C:\Plop\R1.csv" -Encoding Default -Header $Header -Delimiter ";" $result = (Compare-Object -ReferenceObject @($F1 | Where-Object {$_.SideIndicator -eq $null}) -DifferenceObject @($F2 | Where-Object {$_.SideIndicator -eq $null}) -Property A, B, C, D, E -ErrorAction SilentlyContinue) | Where-Object {$_.SideIndicator -eq "=>"} | Select-Object A, B, C, D, E, @{Label="CODE_MV";Expression={"Modifier"}}
J'ai bien sûr fait des tests différents que celle belle ligne de code à base d’if imbriquer dans des If, mais deux csv de plus de 8000 lignes et 14 colonnes à comparer voilà la violence.....
Je dois faire à peu près le même travail que celui de ce sujet, mais avec quelques légères différences et il me reste que ce petit détail. Merci pour votre aide.
Peux tu transmettre les fichiers d'entré de test, ce que tu souhaite en sortie et sur quelle critère.