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 :

Extraire des colonnes non déterminées d'un fichier csv et export en csv [PowerShell]


Sujet :

Scripts/Batch

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 7
    Par défaut Extraire des colonnes non déterminées d'un fichier csv et export en csv
    Bonjour à tous,

    Le contexte : j'ai des fichiers csv dans lesquel je dois extraire des colonnes dont le nom de ces colonnes se trouvent dans un fichier de paramètres. Ce fichier de paramètres pouvant évoluer.

    Dans un premier temps, je lis mon fichier de paramètres pour récupérer dans une chaine, la liste des colonnes. Puis, je traite mes fichiers csv un par un.

    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    get-childitem -path $app_dir\TEMP\*.csv | foreach ($_) { # traitement du fichier
                 Import-Csv -delimiter ';' $_ | Select $ColIn | Export-Csv $o -delimiter ';' –NTI 
                # on supprime les guillemets
                (Get-Content $o) | Foreach-Object {$_ -replace '"', ''}|Out-File $o
             }

    $ColIn contient la liste des colonnes : COMPTE,LIBELLE,VIDE3,VIDE4,VIDE5,SOLDE

    Lorsque j'exécute le powershell, le fichier csv ne contient que la liste $ColIn.
    Pourquoi la transcription de la valeur de $ColIn ne se fait pas ?

    Par contre, si je donne le nom des colonnes au Select, pas de problème, j'obtiens le bon résultat.
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    get-childitem -path $app_dir\TEMP\*.csv | foreach ($_) { # traitement du fichier
                              $col1="COMPTE"
                              $col2="LIBELLE"
                              $col3="VIDE3"
                              $col4="VIDE4"
                              $col5="VIDE5"
                              $col6="SOLDE"
                              Import-Csv -delimiter ';' $_ | Select $col1,$col2,$col3,$col4,$col5,$col6 | Export-Csv $o -delimiter ';' –NTI 
                             # on supprime les guillemets
                             (Get-Content $o) | Foreach-Object {$_ -replace '"', ''}|Out-File $o

    Si vous avez une idée d'où je fais une erreur ou si vous avez une réponse, je suis preneur.
    Merci.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2015
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

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

    Informations forums :
    Inscription : Juillet 2015
    Messages : 66
    Par défaut
    Hello,

    j'ai essayé de reproduire le problème sans vraiment réussir.

    Voici le code modifié:

    J'ai défini quelques variables pour permettre de m'ajuster à ton example:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $app_dir = "c:"
    $o = "c:\temp\resultat.txt"
    $ColIn = "COMPTE","LIBELLE","VIDE3","VIDE4","VIDE5","SOLDE"
    Mon fichier .csv est tout simple mais comporte plus de colonnes que demandé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    COMPTE;LIBELLE;VIDE1;VIDE2;VIDE3;VIDE4;VIDE5;SOLDE
    50605;UnDeuxTrois;29;30;31;32;33;11
    60605;QuatreCinq;59;50;51;52;53;21
    Avec ça on devrait avoir un base similaire.

    Ensuite j'ai cassé un peu la suite de commandes et leurs pipes pour voir un peu ce qui se passe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    get-childitem -path $app_dir\TEMP\*.csv | ForEach-Object { # traitement du fichier
                 $i = Import-Csv -delimiter ';' $_ 
    			 $i | Select $ColIn | Export-Csv $o -delimiter ';' –NTI 
                # on supprime les guillemets
                (Get-Content $o) | Foreach-Object {$_ -replace '"', ''}|Out-File $o
             }
    A noter que j'ai modifié ton premier ForEach bien que le problème ne soit pas là.

    Après récupération des données dans $i
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $i = Import-Csv -delimiter ';' $_
    $i devient un array qui contient:

    Code : 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
    COMPTE  : 50605
    LIBELLE : UnDeuxTrois
    VIDE1   : 29
    VIDE2   : 30
    VIDE3   : 31
    VIDE4   : 32
    VIDE5   : 33
    SOLDE   : 11
    
    COMPTE  : 60605
    LIBELLE : QuatreCinq
    VIDE1   : 59
    VIDE2   : 50
    VIDE3   : 51
    VIDE4   : 52
    VIDE5   : 53
    SOLDE   : 21
    Ensuite ce n'est que de la descente, $colIn selectionne bien que les colonnes voulues

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $i | Select $ColIn | Export-Csv $o -delimiter ';' –NTI
    Vérifier ici que ton $ColIn est bien de type Array, avec ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ColIn.GetType()
    
    IsPublic IsSerial Name                                     BaseType                               
    -------- -------- ----                                     --------                               
    True     True     Object[]                                 System.Array
    Peut-être que le problème vient de là.

    Une fois sauvegardé, résultat.txt contient ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    "COMPTE";"LIBELLE";"VIDE3";"VIDE4";"VIDE5";"SOLDE"
    "50605";"UnDeuxTrois";"31";"32";"33";"11"
    "60605";"QuatreCinq";"51";"52";"53";"21"
    Finalement on enlève les guillemets comme tu le fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (Get-Content $o) | Foreach-Object {$_ -replace '"', ''}|Out-File $o
    Pour un résultat final qui ressemble à ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    COMPTE;LIBELLE;VIDE3;VIDE4;VIDE5;SOLDE
    50605;UnDeuxTrois;31;32;33;11
    60605;QuatreCinq;51;52;53;21

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 7
    Par défaut
    Bonjour,

    merci mickyballadelli pour la réponse.

    L'erreur venait bien de la déclaration de la variable $ColIn. Je l'avais déclaré en tant qu'objet et non pas en tant que array.
    J'ai testé en découpant le pipe et en laissant mon code d'origine et les deux solutions fonctionnent.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Extraire des colonnes awk
    Par sab113 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 01/10/2012, 16h21
  2. Faire la moyenne d'une ligne avec des colonnes non conjointes
    Par NewYork dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 27/12/2010, 10h06
  3. Faire apparaître des colonnes non nulles
    Par nathieb dans le forum SQL
    Réponses: 3
    Dernier message: 18/11/2010, 22h55
  4. Tri des colonnes non liées d'un datagridview
    Par Bluberiman dans le forum Windows Forms
    Réponses: 4
    Dernier message: 13/05/2010, 18h27
  5. Ordre des colonnes non triée alphabetiquement
    Par mouss4rs dans le forum JPA
    Réponses: 4
    Dernier message: 30/05/2008, 16h51

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