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 #18667
par alex
Comparaison de deux fichiers CSV a été créé par alex
Bonjour, étant débutant en Powershell je dois faire un script permettant de comparer deux fichiers CSV, l'un contenant des informations sur des utilisateurs, et l'autre qui est une base de données de prénoms.
Ce que je dois faire est comparer les prénoms de chaque utilisateur avec ceux dans la base de données, et si celui-ci est présent, je l'ajoute dans un nouveau fichier CSV.
J'ai déjà essayé de faire un script avec ce que j'ai pu trouver sur ce forum, mais le fichier créé est totalement vide(alors qu'il ne devrait pas).
Voici le script dans son état actuel :
[code:1]
$ResultFileName = \"C:\Users\resultat.csv\"
$Users = Import-Csv -Path C:\Users\testuser.csv
$Names = Import-Csv -Path C:\Users\names.csv
# Création d'une table qui contiendra les résultats
$ResultTable = @();
# pour chaque utilisateur
foreach ($User in $Users)
{
# je récupère les prénoms des utilisateurs
$PnomUser=$User.FirstName
# je converti la liste récupérée en liste de chaine de caractères
$PnomUser= [string[]]$PnomUser
# je récupère les prénoms de la base de données de prénoms
foreach ($Name in $Names){
$Pnom=$User.prenom
$Pnom=[string[]]$Pnom
# si le prénom du client est dans la base de données
if ($PnomUser -eq $Pnom) {
# on l'ajoute dans un objet
$resultTable += New-object -TypeName psobject -Property @{
'Prenom'=$User.FirstName;
'Nom'=$User.LastName;
}
}
}
}
# J'écris le contenu de la collection $ResulTable dans le fichier .csv
$ResultTable | Select-Object -Property 'Prenom','Nom' | Export-csv -path $ResultFileName -Delimiter \",\" -NoTypeInformation -Encoding UTF8 -Force;
[/code:1]
J'aimerais savoir si je suis au moins sur la bonne piste, et si il est possible d'optimiser le script (car la base de données contient plus de 120 000 prénoms).
Merci d'avance pour votre aide !
Ce que je dois faire est comparer les prénoms de chaque utilisateur avec ceux dans la base de données, et si celui-ci est présent, je l'ajoute dans un nouveau fichier CSV.
J'ai déjà essayé de faire un script avec ce que j'ai pu trouver sur ce forum, mais le fichier créé est totalement vide(alors qu'il ne devrait pas).
Voici le script dans son état actuel :
[code:1]
$ResultFileName = \"C:\Users\resultat.csv\"
$Users = Import-Csv -Path C:\Users\testuser.csv
$Names = Import-Csv -Path C:\Users\names.csv
# Création d'une table qui contiendra les résultats
$ResultTable = @();
# pour chaque utilisateur
foreach ($User in $Users)
{
# je récupère les prénoms des utilisateurs
$PnomUser=$User.FirstName
# je converti la liste récupérée en liste de chaine de caractères
$PnomUser= [string[]]$PnomUser
# je récupère les prénoms de la base de données de prénoms
foreach ($Name in $Names){
$Pnom=$User.prenom
$Pnom=[string[]]$Pnom
# si le prénom du client est dans la base de données
if ($PnomUser -eq $Pnom) {
# on l'ajoute dans un objet
$resultTable += New-object -TypeName psobject -Property @{
'Prenom'=$User.FirstName;
'Nom'=$User.LastName;
}
}
}
}
# J'écris le contenu de la collection $ResulTable dans le fichier .csv
$ResultTable | Select-Object -Property 'Prenom','Nom' | Export-csv -path $ResultFileName -Delimiter \",\" -NoTypeInformation -Encoding UTF8 -Force;
[/code:1]
J'aimerais savoir si je suis au moins sur la bonne piste, et si il est possible d'optimiser le script (car la base de données contient plus de 120 000 prénoms).
Merci d'avance pour votre aide !
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 #18668
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Comparaison de deux fichiers CSV
Salut,
$Names n'est pas utilisé dans la boucle foreach ($Name in $Names). Et sans données de test ce n'est pas facile d'aller plus loin.
Pour optimiser tu peux regrouper chaque cast [string[]] en une ligne et surtout éviter le += avec un System.Array ( remplacer par un Arraylist).
Ensuite vue la volumétrie, un arbre permettrait d’accélérer les recherches.
Ta base contient les prénoms de + langues je supposes ?
Et pourquoi ne pas effectuer ce traitement en base, si le colonne prénom est indexée ?
$Names n'est pas utilisé dans la boucle foreach ($Name in $Names). Et sans données de test ce n'est pas facile d'aller plus loin.
Pour optimiser tu peux regrouper chaque cast [string[]] en une ligne et surtout éviter le += avec un System.Array ( remplacer par un Arraylist).
Ensuite vue la volumétrie, un arbre permettrait d’accélérer les recherches.
Ta base contient les prénoms de + langues je supposes ?
Et pourquoi ne pas effectuer ce traitement en base, si le colonne prénom est indexée ?
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 #18676
par alex
Réponse de alex sur le sujet Re:Comparaison de deux fichiers CSV
Merci de ta réponse, j'ai fais l'erreur la plus stupide du monde ahah...
Je ne peux pas faire ça en base tout simplement parce que je n'en ai pas a disposition ^^
Je ne peux pas faire ça en base tout simplement parce que je n'en ai pas a disposition ^^
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 #18678
par Philippe
Réponse de Philippe sur le sujet Re:Comparaison de deux fichiers CSV
pourquoi tu converti tout en tableau ?
[code:1] $PnomUser= [string[]]$PnomUser
$Pnom=[string[]]$Pnom
[/code:1]
ta comparaison ne fonctionne pas sur les tableaux !
[code:1] if ($PnomUser -eq $Pnom) {[/code:1]
en fait ca fonctionne si ta qu'un éléments dans les tableaux !!
<br><br>Message édité par: 6ratgus, à: 29/12/14 17:53
[code:1] $PnomUser= [string[]]$PnomUser
$Pnom=[string[]]$Pnom
[/code:1]
ta comparaison ne fonctionne pas sur les tableaux !
[code:1] if ($PnomUser -eq $Pnom) {[/code:1]
en fait ca fonctionne si ta qu'un éléments dans les tableaux !!
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 #18679
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Comparaison de deux fichiers CSV
6ratgus écrit:
[code:1]
$t='un','deux','trois','un'
$t -eq 'un'
#un
#un
if ($t -eq 'un') {'ok'} else {'nok'}
#ok
if ($t -eq 'quatre') {'ok'} else {'nok'}
#nok
$t -Contains 'un'
#true
$t -Contains 'quatre'
#false
[/code:1]
Mais avec 120 mille prénoms, je pense que tu auras le temps de prendre un café
J'ai comme un doute :ta comparaison ne fonctionne pas sur les tableaux !
[code:1]
$t='un','deux','trois','un'
$t -eq 'un'
#un
#un
if ($t -eq 'un') {'ok'} else {'nok'}
#ok
if ($t -eq 'quatre') {'ok'} else {'nok'}
#nok
$t -Contains 'un'
#true
$t -Contains 'quatre'
#false
[/code:1]
Mais avec 120 mille prénoms, je pense que tu auras le temps de prendre un café
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 #18680
par Philippe
Réponse de Philippe sur le sujet Re:Comparaison de deux fichiers CSV
ok mais entre deux tableaux ko
[code:1]$t='un','deux','trois','un'
$s = 'cinq', 'six', 'un'
if ($t -eq $s) {'ok'} else {'nok'}
#nok
[/code:1]
[code:1]$t='un','deux','trois','un'
$s = 'cinq', 'six', 'un'
if ($t -eq $s) {'ok'} else {'nok'}
#nok
[/code:1]
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.055 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Comparaison de deux fichiers CSV