Question Comparaison de deux fichiers CSV

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

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

Plus d'informations
il y a 11 ans 2 mois #18668 par Laurent Dardenne
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 ?

Tutoriels PowerShell

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

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

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

Plus d'informations
il y a 11 ans 2 mois #18678 par Philippe
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 !! B)<br><br>Message édité par: 6ratgus, à: 29/12/14 17:53

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

Plus d'informations
il y a 11 ans 2 mois #18679 par Laurent Dardenne
6ratgus écrit:

ta comparaison ne fonctionne pas sur les tableaux !

J'ai comme un doute :
[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é :lol:

Tutoriels PowerShell

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

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

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

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