Question Comparaison de deux fichiers CSV

Plus d'informations
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

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.

Plus d'informations
il y a 11 ans 2 mois #18754 par Philippe
pour mes tests une valeurs approximative a mille près me suffit

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

Plus d'informations
il y a 11 ans 2 mois #18755 par Philippe
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 !!!

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

Plus d'informations
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.

Plus d'informations
il y a 11 ans 2 mois #18757 par Philippe
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 = \&quot;C:\Users\resultat.csv\&quot;
$users = New-Object System.Collections.ArrayList
Get-Content -Path C:\Users\users.csv | Foreach-Object { $users.Add(($($_.split(\&quot;,\&quot;«»)[0]), $($_.split(\&quot;,\&quot;«»)[1]), $($_.split(\&quot;,\&quot;«»)[2]), $($_.split(\&quot;,\&quot;«»)[3]), $($_.split(\&quot;,\&quot;«»)[4]))) | out-null}
$names = New-Object System.Collections.ArrayList
Get-Content -Path C:\Users_CRLF_ames.csv | Foreach-Object { $names.Add(($($_.split(\&quot;,\&quot;«»)[0]), $($_.split(\&quot;,\&quot;«»)[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 { \&quot;$_\&quot; } | 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.

Plus d'informations
il y a 11 ans 2 mois #18758 par Philippe
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 !!! :whistle:<br><br>Message édité par: 6ratgus, à: 7/01/15 17:49

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

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