Question
Comparaison de deux fichiers CSV
- alex
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 15
- Remerciements reçus 0
il y a 11 ans 2 mois #18753
par alex
Réponse de alex sur le sujet Re:Comparaison de deux fichiers CSV
Il y a 4915 utilisateur dans le fichier users.csv
Oui comme je l'ai indiqué mes besoins ont légèrement changé.
J'ai déjà réussi à dégrossir une partie des utilisateurs et maintenant je dois comparer cette liste avec une autre d'environ 4000 occurrences.
Néanmoins j'ai remarqué que le script est beaucoup plus long à s'exécuter, sans doutes parce qu'il compare le prénom ET le nom, et qu'il écrit tous les champs de l'utilisateur.
Si ça peut aider, voici le script que j'ai actuellement avec les infos de Laurent :
[code:1]
$ResultFileName = \"C:\Users\resultat.csv\"
$Users = Import-Csv C:\Users\users.csv
$Names = Import-Csv C:\Users\names.csv
$List = New-Object System.Collections.ArrayList
foreach ($User in $Users)
{
foreach ($Name in $Names)
{
if ($User.FirstName -ne $Name.FirstName -and $User.LastName -ne $Name.LastName)
{
$List.Add(($User.EmailAddress, $User.FirstName, $User.LastName, $User.LastLogin, $User.FirstLogin)) | out-null
$OFS=','
}
}
}
$List | Foreach-Object { \"$_\" } | Set-Content $ResultFileName
[/code:1]<br><br>Message édité par: Helongh, à: 7/01/15 15:15
il va te falloir modifier ton premier script car tu fais l'inverse pour l'instant
Oui comme je l'ai indiqué mes besoins ont légèrement changé.
J'ai déjà réussi à dégrossir une partie des utilisateurs et maintenant je dois comparer cette liste avec une autre d'environ 4000 occurrences.
Néanmoins j'ai remarqué que le script est beaucoup plus long à s'exécuter, sans doutes parce qu'il compare le prénom ET le nom, et qu'il écrit tous les champs de l'utilisateur.
Si ça peut aider, voici le script que j'ai actuellement avec les infos de Laurent :
[code:1]
$ResultFileName = \"C:\Users\resultat.csv\"
$Users = Import-Csv C:\Users\users.csv
$Names = Import-Csv C:\Users\names.csv
$List = New-Object System.Collections.ArrayList
foreach ($User in $Users)
{
foreach ($Name in $Names)
{
if ($User.FirstName -ne $Name.FirstName -and $User.LastName -ne $Name.LastName)
{
$List.Add(($User.EmailAddress, $User.FirstName, $User.LastName, $User.LastLogin, $User.FirstLogin)) | out-null
$OFS=','
}
}
}
$List | Foreach-Object { \"$_\" } | Set-Content $ResultFileName
[/code:1]<br><br>Message édité par: Helongh, à: 7/01/15 15:15
Connexion ou Créer un compte pour participer à la conversation.
- Philippe
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 1778
- Remerciements reçus 21
il y a 11 ans 2 mois #18754
par Philippe
Réponse de Philippe sur le sujet Re:Comparaison de deux fichiers CSV
pour mes tests une valeurs approximative a mille près me suffit
Connexion ou Créer un compte pour participer à la conversation.
- Philippe
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 1778
- Remerciements reçus 21
il y a 11 ans 2 mois #18755
par Philippe
Réponse de Philippe sur le sujet Re:Comparaison de deux fichiers CSV
je vois que tu a déjà repondu au nombre
par contre tu peut déplacer le $OFS avant ou après les boucle, tu gagnera quelque secondes !!!
par contre tu peut déplacer le $OFS avant ou après les boucle, tu gagnera quelque secondes !!!
Connexion ou Créer un compte pour participer à la conversation.
- alex
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 15
- Remerciements reçus 0
il y a 11 ans 2 mois #18756
par alex
Réponse de alex sur le sujet Re:Comparaison de deux fichiers CSV
En fait la chose qui me dérange c'est que ce script va faire que pour chaque utilisateur, a chaque fois qu'il va voir qu'il n'est pas égal au prénom et au nom du deuxième foreach il va l'ajouter au tableau, ce qui au final va me donner une liste avec des doublons énormes.
Connexion ou Créer un compte pour participer à la conversation.
- Philippe
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 1778
- Remerciements reçus 21
il y a 11 ans 2 mois #18757
par Philippe
Réponse de Philippe sur le sujet Re:Comparaison de deux fichiers CSV
astuce c'est de trouvé si l'utilisateur est présent et dans ce cas de pas faire l'action d'ajout :
[code:1] $present = 0
foreach ($Name in $Names) {
if ($User.FirstName -eq $Name.FirstName -and $User.LastName -eq $Name.LastName) {
$present = 1 # present au moins une fois
}
}
if (!$present) { # si absent
$List.Add(($User.EmailAddress, $User.FirstName, $User.LastName, $User.LastLogin, $User.FirstLogin)) | out-null
}
[/code:1]
ci-dessous le code optimisé avec arraylist
ca réduit d'un quart le temps de travail !
c'est moins lisible mais plus rapide
je passe donc 40 minutes de traitement sur mon poste à 30 minutes
a toi de voir sur ton ordinateur
[code:1]$ResultFileName = \"C:\Users\resultat.csv\"
$users = New-Object System.Collections.ArrayList
Get-Content -Path C:\Users\users.csv | Foreach-Object { $users.Add(($($_.split(\",\"«»)[0]), $($_.split(\",\"«»)[1]), $($_.split(\",\"«»)[2]), $($_.split(\",\"«»)[3]), $($_.split(\",\"«»)[4]))) | out-null}
$names = New-Object System.Collections.ArrayList
Get-Content -Path C:\Users_CRLF_ames.csv | Foreach-Object { $names.Add(($($_.split(\",\"«»)[0]), $($_.split(\",\"«»)[1]))) | out-null}
$List = New-Object System.Collections.ArrayList
foreach ($User in $Users) {
$present = 0
foreach ($Name in $Names) {
if ($User[1] -eq $Name[0] -and $User[2] -eq $Name[1]) {
$present = 1 # present au moins une fois
}
}
if (!$present) { # si absent
$List.Add(($User[0], $User[1], $User[2], $User[3], $User[4])) | out-null
}
}
$OFS=','
$List | Foreach-Object { \"$_\" } | Set-Content $ResultFileName
[/code:1]
Message édité par: 6ratgus, à: 7/01/15 17:28<br><br>Message édité par: 6ratgus, à: 7/01/15 17:29
[code:1] $present = 0
foreach ($Name in $Names) {
if ($User.FirstName -eq $Name.FirstName -and $User.LastName -eq $Name.LastName) {
$present = 1 # present au moins une fois
}
}
if (!$present) { # si absent
$List.Add(($User.EmailAddress, $User.FirstName, $User.LastName, $User.LastLogin, $User.FirstLogin)) | out-null
}
[/code:1]
ci-dessous le code optimisé avec arraylist
ca réduit d'un quart le temps de travail !
c'est moins lisible mais plus rapide
je passe donc 40 minutes de traitement sur mon poste à 30 minutes
a toi de voir sur ton ordinateur
[code:1]$ResultFileName = \"C:\Users\resultat.csv\"
$users = New-Object System.Collections.ArrayList
Get-Content -Path C:\Users\users.csv | Foreach-Object { $users.Add(($($_.split(\",\"«»)[0]), $($_.split(\",\"«»)[1]), $($_.split(\",\"«»)[2]), $($_.split(\",\"«»)[3]), $($_.split(\",\"«»)[4]))) | out-null}
$names = New-Object System.Collections.ArrayList
Get-Content -Path C:\Users_CRLF_ames.csv | Foreach-Object { $names.Add(($($_.split(\",\"«»)[0]), $($_.split(\",\"«»)[1]))) | out-null}
$List = New-Object System.Collections.ArrayList
foreach ($User in $Users) {
$present = 0
foreach ($Name in $Names) {
if ($User[1] -eq $Name[0] -and $User[2] -eq $Name[1]) {
$present = 1 # present au moins une fois
}
}
if (!$present) { # si absent
$List.Add(($User[0], $User[1], $User[2], $User[3], $User[4])) | out-null
}
}
$OFS=','
$List | Foreach-Object { \"$_\" } | Set-Content $ResultFileName
[/code:1]
Message édité par: 6ratgus, à: 7/01/15 17:28<br><br>Message édité par: 6ratgus, à: 7/01/15 17:29
Connexion ou Créer un compte pour participer à la conversation.
- Philippe
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 1778
- Remerciements reçus 21
il y a 11 ans 2 mois #18758
par Philippe
Réponse de Philippe sur le sujet Re:Comparaison de deux fichiers CSV
tu peut encore gagné du temps rajoutant un break des t'il trouve une correspondance (inutile de continuer)
ici :[code:1] $present = 1 # present au moins une fois
break
}[/code:1]
a première vu ça devrait au moins divisé par deux le temps de traitement
je peut pas données de resultat precis avec des données fictive
avec mes données 5000 users et 120000 names je met moins une minutes !!!
<br><br>Message édité par: 6ratgus, à: 7/01/15 17:49
ici :[code:1] $present = 1 # present au moins une fois
break
}[/code:1]
a première vu ça devrait au moins divisé par deux le temps de traitement
je peut pas données de resultat precis avec des données fictive
avec mes données 5000 users et 120000 names je met moins une minutes !!!
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.051 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Comparaison de deux fichiers CSV