Question
Comparaison de deux fichiers CSV
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 11 ans 2 mois #18759
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Comparaison de deux fichiers CSV
J'ai un peu de mal à vous suivre, mais je note ceci :
si la collection ne doit pas contenir de doublons, mieux vaut adapter le type, par exemple HashSet.
Celle-ci permet également des comparaisons entre collections plus rapide que compare-object, mais il me reste à étudier la comparasion sur une propriété d'objet.
Je ne comprend pas pourquoi vous ne placez pas l'objet directement dans la collection.
Dans la boucle, $User.FirstName peut être mis en 'cache' avant la seconde boucle, il y aura moins d'accès indexè sur la donnée.
Faute de jeux de test, je ne sais pas si l'ajout d'un membre FullName peut accélérer ce traitement.
si la collection ne doit pas contenir de doublons, mieux vaut adapter le type, par exemple HashSet.
Celle-ci permet également des comparaisons entre collections plus rapide que compare-object, mais il me reste à étudier la comparasion sur une propriété d'objet.
Je ne comprend pas pourquoi vous ne placez pas l'objet directement dans la collection.
Dans la boucle, $User.FirstName peut être mis en 'cache' avant la seconde boucle, il y aura moins d'accès indexè sur la donnée.
Faute de jeux de test, je ne sais pas si l'ajout d'un membre FullName peut accélérer ce traitement.
Tutoriels PowerShell
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 #18760
par Philippe
[code:1][System.Collections.ArrayList]$Names = Import-Csv -Path C:\names.csv -Delimiter \",\"
[/code:1]
ce qui crée une collection contenant des objets [code:1]$Names.GetType()
IsPublic IsSerial Name BaseType
----
True True ArrayList System.Object
$Names|gm
TypeName : System.Management.Automation.PSCustomObject
Name MemberType Definition
----
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
Firstname NoteProperty System.String Firstname=Dupontaaaa
LastName NoteProperty System.String LastName=Pierre0 [/code:1]
mais on gagne zéros seconde en temps de traitement par rapport a du 100% objet
d'ou l'usage de [code:1]$names = New-Object System.Collections.ArrayList
Get-Content -Path C:\names.csv | Foreach-Object { $names.Add(($($_.split(\",\"«»)[0]), $($_.split(\",\"«»)[1]))) | out-null}
[/code:1]qui permet de gagné 25%(et 2 fois plus avec le break) de temps sur les une ou deux heures de traitement
les doublons n'est pas le probleme mais leurs créations
le script genere 120 milles fois 5 milles utilisateurs moins 1
soit beaucoup trop de doublon
si tu veut faire des testes j'ai généré les fichiers avec ceci :[code:1]$ArrayList = New-Object System.Collections.ArrayList
$ok = 0
$ArrayList.Add((\"Firstname\",\"LastName\"«»))
foreach ($i in 97..122) {
foreach ($j in 97..122) {
foreach ($k in 97..122) {
foreach ($l in 97..122) {
#write-host \"$([char]$i)$([char]$j)$([char]$k)$ok\"
$ArrayList.Add((\"Dupont$([char]$i)$([char]$j)$([char]$k)$([char]$l)\", \"Pierre$ok\"«»)) | out-null
$ok++
if ($ok -ge 120000) {break}
}
if ($ok -ge 120000) {break}
}
if ($ok -ge 120000) {break}
}
if ($ok -ge 120000) {break}
}
$ok
$ofs=','
$ArrayList | Foreach-object {\"$_\" } | Set-Content \"c:\names.csv\"
$ArrayList = New-Object System.Collections.ArrayList
$ok = 0
$ArrayList.Add((\"EmailAddress\",\"FirstName\",\"LastName\",\"LastLogin\",\"FirstLogin\"«»))
foreach ($i in 97..122) {
foreach ($j in 97..122) {
foreach ($k in 97..122) {
foreach ($l in 97..122) {
#write-host \"$([char]$i)$([char]$j)$([char]$k)$ok\"
$ArrayList.Add((\"pdupont@email.com\", \"Dupont$([char]$i)$([char]$j)$([char]$k)$([char]$l)\", \"Pierre$ok\",20141221,20141220)) | out-null
$ok++
if ($ok -ge 5000) {break}
}
if ($ok -ge 5000) {break}
}
if ($ok -ge 5000) {break}
}
if ($ok -ge 5000) {break}
}
$ok
$ArrayList.count
$ofs=','
$ArrayList | Foreach-object {\"$_\" } | Set-Content \"c:\users.csv\"[/code:1]et tu a le script dans les précédants post
Réponse de Philippe sur le sujet Re:Comparaison de deux fichiers CSV
j'ai fait ceci :Je ne comprend pas pourquoi vous ne placez pas l'objet directement dans la collection.
[code:1][System.Collections.ArrayList]$Names = Import-Csv -Path C:\names.csv -Delimiter \",\"
[/code:1]
ce qui crée une collection contenant des objets [code:1]$Names.GetType()
IsPublic IsSerial Name BaseType
----
True True ArrayList System.Object
$Names|gm
TypeName : System.Management.Automation.PSCustomObject
Name MemberType Definition
----
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
Firstname NoteProperty System.String Firstname=Dupontaaaa
LastName NoteProperty System.String LastName=Pierre0 [/code:1]
mais on gagne zéros seconde en temps de traitement par rapport a du 100% objet
d'ou l'usage de [code:1]$names = New-Object System.Collections.ArrayList
Get-Content -Path C:\names.csv | Foreach-Object { $names.Add(($($_.split(\",\"«»)[0]), $($_.split(\",\"«»)[1]))) | out-null}
[/code:1]qui permet de gagné 25%(et 2 fois plus avec le break) de temps sur les une ou deux heures de traitement
la il y a une erreur de d'analysesi la collection ne doit pas contenir de doublons, mieux vaut adapter le type, par exemple HashSet.
les doublons n'est pas le probleme mais leurs créations
le script genere 120 milles fois 5 milles utilisateurs moins 1
soit beaucoup trop de doublon
la je peut pas dire mais j'ai déjà trop de temps la dessusDans la boucle, $User.FirstName peut être mis en 'cache' avant la seconde boucle, il y aura moins d'accès indexè sur la donnée.
si tu veut faire des testes j'ai généré les fichiers avec ceci :[code:1]$ArrayList = New-Object System.Collections.ArrayList
$ok = 0
$ArrayList.Add((\"Firstname\",\"LastName\"«»))
foreach ($i in 97..122) {
foreach ($j in 97..122) {
foreach ($k in 97..122) {
foreach ($l in 97..122) {
#write-host \"$([char]$i)$([char]$j)$([char]$k)$ok\"
$ArrayList.Add((\"Dupont$([char]$i)$([char]$j)$([char]$k)$([char]$l)\", \"Pierre$ok\"«»)) | out-null
$ok++
if ($ok -ge 120000) {break}
}
if ($ok -ge 120000) {break}
}
if ($ok -ge 120000) {break}
}
if ($ok -ge 120000) {break}
}
$ok
$ofs=','
$ArrayList | Foreach-object {\"$_\" } | Set-Content \"c:\names.csv\"
$ArrayList = New-Object System.Collections.ArrayList
$ok = 0
$ArrayList.Add((\"EmailAddress\",\"FirstName\",\"LastName\",\"LastLogin\",\"FirstLogin\"«»))
foreach ($i in 97..122) {
foreach ($j in 97..122) {
foreach ($k in 97..122) {
foreach ($l in 97..122) {
#write-host \"$([char]$i)$([char]$j)$([char]$k)$ok\"
$ArrayList.Add((\"pdupont@email.com\", \"Dupont$([char]$i)$([char]$j)$([char]$k)$([char]$l)\", \"Pierre$ok\",20141221,20141220)) | out-null
$ok++
if ($ok -ge 5000) {break}
}
if ($ok -ge 5000) {break}
}
if ($ok -ge 5000) {break}
}
if ($ok -ge 5000) {break}
}
$ok
$ArrayList.count
$ofs=','
$ArrayList | Foreach-object {\"$_\" } | Set-Content \"c:\users.csv\"[/code:1]et tu a le script dans les précédants post
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 11 ans 2 mois #18764
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Comparaison de deux fichiers CSV
Le précédent jeux de données renvoi des noms et prénoms identiques il me semble.
J'ai donc récupérer deux jeux à partir d'un site.
Essaie ceci et dis moi si le principe répond à ton besoin :
[code:1]
#Generateur www.mockaroo.com/
# autres sites : c2.com/cgi/wiki?TestDataGenerator
$Users= Import-csv \"c:\temp\users.csv\" -Delimiter ',' |
Foreach {
$FullName=\"{0} {1}\"-F $_.FirstName,$_.LastName
Add-member -InputObject $_ -membertype NoteProperty -Name FullName -Value $FullName -PassThru
}
$Names= Import-csv \"c:\temp\names.csv\" -Delimiter ',' |
Foreach {
$FullName=\"{0} {1}\"-F $_.FirstName,$_.LastName
Add-member -InputObject $_ -membertype NoteProperty -Name FullName -Value $FullName -PassThru
}
$o=compare-object $Names $users -Property Fullname -IncludeEqual|group-object SideIndicator
$o
$o[0]
$o[0].group
[/code:1]<br><br>Message édité par: Laurent Dardenne, à: 8/01/15 10:51
J'ai donc récupérer deux jeux à partir d'un site.
Essaie ceci et dis moi si le principe répond à ton besoin :
[code:1]
#Generateur www.mockaroo.com/
# autres sites : c2.com/cgi/wiki?TestDataGenerator
$Users= Import-csv \"c:\temp\users.csv\" -Delimiter ',' |
Foreach {
$FullName=\"{0} {1}\"-F $_.FirstName,$_.LastName
Add-member -InputObject $_ -membertype NoteProperty -Name FullName -Value $FullName -PassThru
}
$Names= Import-csv \"c:\temp\names.csv\" -Delimiter ',' |
Foreach {
$FullName=\"{0} {1}\"-F $_.FirstName,$_.LastName
Add-member -InputObject $_ -membertype NoteProperty -Name FullName -Value $FullName -PassThru
}
$o=compare-object $Names $users -Property Fullname -IncludeEqual|group-object SideIndicator
$o
$o[0]
$o[0].group
[/code:1]<br><br>Message édité par: Laurent Dardenne, à: 8/01/15 10:51
Tutoriels PowerShell
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 #18767
par alex
Réponse de alex sur le sujet Re:Comparaison de deux fichiers CSV
Bonjour,
Merci de vous être tant investi pour m'aider, je vous en suis vraiment reconnaissant.
J'ai utilisé le script de 6ratgus et il correspond parfaitement à mes besoins.
Merci encore de votre aide.
Merci de vous être tant investi pour m'aider, je vous en suis vraiment reconnaissant.
J'ai utilisé le script de 6ratgus et il correspond parfaitement à mes besoins.
Merci encore de votre aide.
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