IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

Jointure dans des fichiers CSV


Sujet :

Scripts/Batch

  1. #1
    Candidat au Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Décembre 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Décembre 2019
    Messages : 4
    Par défaut Jointure dans des fichiers CSV
    Bonjour,

    Je démarre en Powershell et je dois effectuer les actions suivantes sur 3 fichiers CSV.
    Je vous explique :
    - Fichier 1:
    A,B,C,D
    Paul,28,Rouge,Homme
    Jean,35,Vert,Homme
    - FIchier 2 :
    E,F,J,
    Paul,180,chat
    Jean,175,chien
    - Fichier3:
    H,I,J,K
    Paul,France, Lyon,avion
    Jean,,,Bus
    Jean,Italy,,
    Je dois récupérer un nouveau fichier avec des jointure et obtenir :
    Paul,28,vert,Homme,180,chat,France,Lyon,avion
    Pouvez-vous me dire comment je dois m'y prendre en powershell ?
    Merci et bonnes fetes

  2. #2
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Tout d’abord, je ne comprend pas comment c'est possible Paul,35,...

    Si on doit faire une jointure entre ces 3 fichiers quel est le critère de jointure ? Numéro de ligne ? Prénom (jamais de doublon ?) ?

  3. #3
    Candidat au Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Décembre 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Décembre 2019
    Messages : 4
    Par défaut Jointure dans des fichiers CSV en PowerShell
    Bonjour Eric,

    Bien vu, j'ai fait une erreur.


    La jointure doit se faire au niveau de l'entête A (Fichier1) et E(Fichier2) et H(fichier3).

    F1:
    A,B,C,D, ID
    Jean,28, Homme,celibataire,001

    F2:
    E,F,J,ID
    Jean,voiture,rouge,001

    ....

    On ne peut pas avoir des doublons car il y a un ID unique que j'ai oublié de préciser dans chaque le fichier

    Merci pour ton aide Eric.

  4. #4
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    H,I,J,K
    Paul,France, Lyon,avion
    Jean,,,Bus
    Jean,Italy,,
    Ici il y a 2 Jean, c'est normal ?

  5. #5
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    F2:
    E,F,J,ID
    Jean,voiture,rouge,001
    Ca devrait pas plutôt être E,F,G,ID ?

  6. #6
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    J'ai considéré que j'avais raison.
    Je t'ai fait un truc assez moche mais qui fonctionne même avec ton doublon d'ID comme dans ton exemple. Si tu est sur de ne pas avoir de doublon tu peux assigner directement la valeur en supprimant les if (![string]::IsNullOrEmpty($_.*)) {}

    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    $i1 = Import-Csv -Path "1.csv"
    $i2 = Import-Csv -Path "2.csv"
    $i3 = Import-Csv -Path "3.csv"
     
    $IDs = ($i1.ID + $i2.ID + $i3.ID) | Select-Object -Unique
     
    $items = @()
     
    foreach($id in $IDs)
    {
        $item = [PSCustomObject]@{
            ID = $id
     
            A = ''
            B = ''
            C = ''
            D = ''
     
            E = ''
            F = ''
            G = ''
     
            H = ''
            I = ''
            J = ''
            K = ''
        }
     
        $i1 | Where-Object {$_.ID -eq $id} | ForEach-Object {
            if (![string]::IsNullOrEmpty($_.A))
            {
                $item.A = $_.A
            }
            if (![string]::IsNullOrEmpty($_.B))
            {
                $item.B = $_.B
            }
            if (![string]::IsNullOrEmpty($_.C))
            {
                $item.C = $_.C
            }
            if (![string]::IsNullOrEmpty($_.D))
            {
                $item.D = $_.D
            }
        }
     
        $i2 | Where-Object {$_.ID -eq $id} | ForEach-Object {
            if (![string]::IsNullOrEmpty($_.E))
            {
                $item.E = $_.E
            }
            if (![string]::IsNullOrEmpty($_.F))
            {
                $item.F = $_.F
            }
            if (![string]::IsNullOrEmpty($_.G))
            {
                $item.G = $_.G
            }
        }
     
        $i3 | Where-Object {$_.ID -eq $id} | ForEach-Object {
            if (![string]::IsNullOrEmpty($_.H))
            {
                $item.H = $_.H
            }
            if (![string]::IsNullOrEmpty($_.I))
            {
                $item.I = $_.I
            }
            if (![string]::IsNullOrEmpty($_.J))
            {
                $item.J = $_.J
            }
            if (![string]::IsNullOrEmpty($_.K))
            {
                $item.K = $_.K
            }
        }
     
        $items += $item
    }
     
    $items | Export-Csv -Path "result.csv" -NoTypeInformation

    result.csv
    "ID","A","B","C","D","E","F","G","H","I","J","K"
    "001","Paul","28","Rouge","Homme","Paul","180","chat","Paul","France","Lyon","avion"
    "002","Jean","35","Vert","Homme","Jean","175","chien","Jean","Italy","","Bus"

  7. #7
    Candidat au Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Décembre 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Décembre 2019
    Messages : 4
    Par défaut Jointure dans des fichiers CSV
    Hello Eric,

    Je suis impressionné à la vitesse à laquelle tu l’as fait. Un grand merci . J'ai essayé de comprendre le code mais pas évident pour un débutant.

    J’ai appris aujourd’hui qu’il y a des changements dans mes jointures et fichiers, je m’explique :


    Fichier 1 :
    ID, groupe, pays,langue, ville, date de naissance
    001, Groupe1,France,français,Lyon, 1980
    002,Groupe5,Italy,italien, Rome,1972

    Fichier 2 :
    Client,nom , prenom,email
    22225,Dupont,Paul, paul@xx.fr
    12330,Duvent,Jean, jean@xx.com

    Fichier 3 :
    ID, Date of birth, club, numero club,ID Client
    001,1980,foot,X45,22225
    002,1972,basket,X40,12330

    Fichier 4:
    Country,code
    France,+33
    Italy,+41



    Je dois faire une jointure avec les fichiers 1 et 3 et 4 et ensuite 2 :
    Fichier de sortie :
    ID,Country,langue,ville,date de naissance,club,groupe,client,nom,prenom,email
    001,France,français,Lyon,1980,foot,Groupe1,22225,Dupont,Paul, paul@xx.fr


    - L’entête Client et ID client : identifiant client ; on peut renommer l’entête en Client par exemple

    - ID porte le même nom dans fichier 1 et 3

    - Date de naissance et Date of birth c’est la même entête mais avec 2 noms différents

    - Tous les champs peuvent être en doublon

    Comment supprimer les "" dans le fichier csv result ?

    Merci Eric et j’espère que tu passes de bonnes fêtes ..

  8. #8
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    A l'énoncé change !

    A noter que :
    - nous n'avons pas besoin du quatrième fichier, j'ai donc renommé "pays" du fichier 1 en "country" pour obtenir la sortie souhaitée.
    - le fichier 3 fait la liaison entre le 1 et le 2 car il contient à la fois "ID" et "ID Client"
    - un en-tête ne doit pas être suivi d'un espace (dans le fichier 2) : "nom ". Je l'ai corrigé dans le csv. Tu me dira si tu es d'accord avec ça. (avant ne semble pas lui poser de problème, il le supprime).
    - Je suis partie du principe que ID et ID Client sont unique. Dans ce cas la Select-Object -First 1 est surement superflue.


    Comme ceci alors :
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    $i1 = Import-Csv -Path "1.csv" -Encoding Default
    $i2 = Import-Csv -Path "2.csv" -Encoding Default
    $i3 = Import-Csv -Path "3.csv" -Encoding Default
     
    $items = @()
     
    foreach($i in $i1)
    {
        $item = [PSCustomObject]@{
            ID = $i.ID
            Country = $i.pays
            langue = $i.langue
            ville = $i.ville
            "Date De Naissance" = $i."date de naissance"
            club = ""
            groupe = $i.groupe
            client = ""
            nom = ""
            prenom = ""
            email = ""
        }
     
        $i3 | Where-Object {$_.ID -eq $item.id} | Select-Object -First 1 | ForEach-Object {
            $item.client = $_."ID Client"
            $item.club = $_.club
        }
     
        $i2 | Where-Object {$_.Client -eq $item.client} | Select-Object -First 1 | ForEach-Object {
            $item.nom = $_.nom
            $item.prenom = $_.prenom
            $item.email = $_.email
        }
     
        $items += $item
    }
     
    $items | ConvertTo-Csv -NoTypeInformation | ForEach-Object {$_.Replace('"','')} | Set-Content -Path "result.csv" -Encoding Default -Force

    Bonnes fêtes bien sur

  9. #9
    Candidat au Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Décembre 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Décembre 2019
    Messages : 4
    Par défaut Jointure dans des fichiers CSV en PowerShell
    Hello Eric,

    Comment vas-tu ? Prêt pour festoyer
    Merci le script et j'avais aussi quelques questions pour comprendre comment fonctionne les liaisons :

    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $item = [PSCustomObject]@{
            ID = $i.ID
            Country = $i.pays ...

    Pourquoi sur certaines entêtes as-tu mis le $i ?

    Ensuite, la liaison, tu le fais à ce niveau : $i3 | Where-Object {$_.ID -eq $item.id} ?
    A quoi sert le : $item.client = $_."ID Client" ?
    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $i3 | Where-Object {$_.ID -eq $item.id} | Select-Object -First 1 | ForEach-Object {
            $item.client = $_."ID Client"
            $item.club = $_.club

    Merci encore et si je n'ai pas de tes news avant alors je te souhaite une superbe réveillon et rendez-vous en 2020 !!

  10. #10
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $item = [PSCustomObject]@{
    ID = $i.ID
    Country = $i.pays ...

    Pourquoi sur certaines entêtes as-tu mis le $i ?
    Pour chaque ligne dans 1.csv nous allons créer un nouvel objet $item.
    Si l'information est déjà dans 1.csv je complète directement les champs correspondants.


    Ensuite, la liaison, tu le fais à ce niveau : $i3 | Where-Object {$_.ID -eq $item.id} ?
    $i3 est en réalité le contenue de 3.csv
    Oui, je sélectionne seulement de $i3 ce qui correspond à l'id, et je complète mon objet $item

    Pareil pour $i2.

    Une fois que mon objet $item est terminée, je l’ajoute à la liste $items

    Une fois la boucle foreach terminée la liste $items contient toutes les informations, nous n'avons plus qu'a l'exporter.

    $item.client = $_."ID Client"
    Je renseigne le champ client à partir de "ID Client" dans $i3 (3.csv)


    Bonne fête !

  11. #11
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Le code est assez simple en vérité, je ne sais pas si tu as comprit mes réponses.

Discussions similaires

  1. Vérification intégrité de données décrites dans des fichiers csv
    Par xino972 dans le forum Développement de jobs
    Réponses: 4
    Dernier message: 15/07/2019, 15h11
  2. Problème boucle php dans des fichiers csv
    Par lefi0528 dans le forum Langage
    Réponses: 2
    Dernier message: 10/02/2016, 14h52
  3. Réponses: 5
    Dernier message: 30/01/2012, 18h38
  4. Récuperation des donnees dans un fichier .csv
    Par HMorvan dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 04/09/2006, 22h27
  5. Réponses: 12
    Dernier message: 27/01/2006, 11h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo