Comment lire le contenu d’un fichier CSV avec PowerShell ?

I. Présentation

Dans ce tutoriel, nous allons voir comment manipuler le cmdlet "Import-CSV" pour lire et exploiter le contenu d'un fichier CSV à l'aide de PowerShell.

Lorsque l'on s'intéresse au scripting PowerShell, il n'est pas rare de devoir manipuler un fichier CSV pour récupérer les données qu'il contient et les exploiter dans le script.

L'un des cas les plus courants, c'est l'utilisation d'un fichier CSV qui contient des informations sur le personnel de l'entreprise et que l'on va utiliser pour créer les comptes Active Directory. J'ai déjà traité ce cas à l'occasion de mon cours sur l'administration de l'Active Directory avec PowerShell.

Nous allons apprendre un autre exemple : un fichier CSV avec deux colonnes, la première colonne nommée "DossierSource" et la seconde nommée "DossierDestination". On peut voir cela comme une matrice de correspondance, avec des données à transférer d'un dossier source vers un dossier destination.

Voici à quoi ressemble mon fichier CSV :

DossierSource;DossierDestination
C:\Data\Commercial;D:\Donnees\Commercial
C:\Data\Service-Technique;D:\Donnees\Service-Technique
C:\Data\Direction;S:\Donnees-Sensibles\Direction

Voilà le contenu du fichier, un fichier qui est enregistré au format "CSV" (C:\TEMP\data.csv) mais je fais comment maintenant pour lire et exploiter le contenu de ce fichier ? C'est ce que nous allons voir.

II. Utilisation de la commande Import-CSV

Pour importer les données du fichier CSV, PowerShell a une commande prête à l'emploi : Import-CSV. Au niveau des paramètres, il y en a 3 qui sont particulièrement intéressant (et surtout indispensable) : -Path pour préciser le chemin vers le fichier CSV, -Delimiter pour préciser le délimiteur de colonne c'est-à-dire le ";" dans notre cas, et -Encodage pour préciser l'encodage du fichier (si nécessaire).

Import-CSV -Path "C:\TEMP\data.csv" -Delimiter ";"

Le contenu du fichier CSV doit s'afficher dans la console. Voici ce que l'on obtient :

PowerShell - Exemple Import-CSV
PowerShell - Exemple Import-CSV

Si vous avez un fichier CSV avec de nombreuses colonnes et que vous souhaitez en importer uniquement quelques-unes, c'est possible ! Pour cela, il suffit d'utiliser Select-Object :

Import-CSV -Path "C:\TEMP\data.csv" -Delimiter ";" | Select-Object DossierSource

Contrairement à ce que je pensais, le paramètre -Header ne permet pas de sélectionner uniquement certaines colonnes. Il permet de définir de nouveaux noms de colonnes lors de l'importation du fichier CSV. C'est particulièrement intéressant s'il n'y a pas d'en-tête dans le fichier source.

Voici un exemple :

Import-CSV -Path "C:\TEMP\data.csv" -Delimiter ";" -Header Dossier1

Il importera seulement la première colonne et elle sera nommée "Dossier1" au lieu de "DossierSource".

III. Exploiter le fichier CSV avec PowerShell

Afficher le contenu du fichier CSV dans la console, ce n'est pas très utile... Pour exploiter le contenu du fichier dans un script, il faut commencer par stocker son contenu dans une variable. Par exemple, la variable $CSV :

$CSV = Import-CSV -Path "C:\TEMP\data.csv" -Delimiter ";"

Ensuite, si vous affichez le contenu de $CSV, vous devriez voir le contenu de votre fichier CSV.

$CSV

Nous pourrions filtrer le contenu du fichier CSV pour importer seulement certaines lignes. Par exemple, seulement les lignes où le champ "DossierDestination" contient la chaîne "D:" correspondante à notre lecteur D. Pour cela, on va appliquer un filtre avec Where-Object (Where).

$CSV = Import-CSV -Path "C:\TEMP\data.csv" -Delimiter ";" | Where{ $_.DossierDestination -like "D:*" }

Cela n'était qu'un exemple, nous allons conserver notre fichier CSV en entier.

Pour parcourir notre fichier CSV ligne par ligne, rien de mieux qu'une boucle foreach. Ce qui donne :

Foreach($Ligne in $CSV){
 <code>
}

A chaque tour de boucle, la variable $Ligne prendra pour valeur la ligne complète du CSV en progressant du début jusqu'à la fin du fichier CSV, en passant par notre variable $CSV.

Ensuite, au sein de la boucle nous allons pouvoir lire la colonne que l'on souhaite. Pour lire la valeur de la colonne "DossierSource", on utilisera :

$Ligne.DossierSource

Essayez avec cette boucle (aucun risque car on écrit seulement une phrase dans la console) :

Foreach($Ligne in $CSV){
   Write-Host "Données transférées de $($Ligne.DossierSource) vers $($Ligne.DossierDestination)"
}

Elle va retourner le résultat suivant :

# Selon le modèle :
# Données transférées de $($Ligne.DossierSource) vers $($Ligne.DossierDestination)
Données transférées de C:\Data\Commercial vers D:\Donnees\Commercial
Données transférées de C:\Data\Service-Technique vers D:\Donnees\Service-Technique
Données transférées de C:\Data\Direction vers S:\Donnees-Sensibles\Direction

Vous voyez, à chaque tour de boucle les valeurs changent ! Nous parvenons à lire, ligne après ligne, le contenu de $CSV. De quoi nous permettre d'effectuer un véritable traitement : le transfert de nos données d'un dossier vers l'autre.

Pour effectuer réellement le transfert des données du dossier source vers le dossier destination, on va simplement ajouter une ligne basée sur l'utilisation de la commande Move-Item.

Voici le bout de code très basique pour parcourir le fichier CSV et transférer les données :

$CSV = Import-CSV -Path "C:\TEMP\data.csv" -Delimiter ";"

Foreach($Ligne in $CSV){

  Write-Host "Données transférées de $($Ligne.DossierSource) vers $($Ligne.DossierDestination)"
  Move-Item -Path "$($Ligne.DossierSource)\*" -Destination "$($Ligne.DossierDestination)"
}

Bien sûr, il faudrait améliorer cette boucle en vérifiant, par exemple, si les chemins source et destination existent (Test-Path), avant de chercher à transférer les données.

Dans un prochain article, nous verrons comment exporter des données au format CSV avec PowerShell.

Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Partager sur Google+ Envoyer par mail

Florian BURNEL

Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.

Nombre de posts de cet auteur : 5572.Voir tous les posts

8 thoughts on “Comment lire le contenu d’un fichier CSV avec PowerShell ?

  • Bonjour,
    j’ai rajouté un header dans le fichier .csv
    DossierSource;DossierDestination;toto
    C:\Data\Commercial;D:\Donnees\Commercial;unkaki
    C:\Data\Service-Technique;D:\Donnees\Service-Technique;deuxkaki
    C:\Data\Direction;S:\Donnees-Sensibles\Direction;troiskaki
    en lançant la commande
    Import-CSV .\test.csv -Delimiter « ; » -Header DossierSource , toto
    voilà le résultat
    DossierSource toto
    ————- —-
    DossierSource DossierDestination
    C:\Data\Commercial D:\Donnees\Commercial
    C:\Data\Service-Technique D:\Donnees\Service-Technique
    C:\Data\Direction S:\Donnees-Sensibles\Direction
    où est le problème ?
    Merci de votre retour.

    Répondre
    • Bonjour Reda,
      Il y a une coquille dans mon tuto avec ce paramètre. Il ne permet pas de sélectionner uniquement certaines colonnes mais de définir des noms de colonnes différents au niveau de l’importation, c’est pour cela que tu obtiens ce résultat. Pour sélectionner seulement certaines colonnes, il faut utiliser la méthode avec Select-Object mentionnée dans ce tutoriel. Désolé…
      Bon script !
      Florian

      Répondre
  • bonjour
    après exportation en fichier csv, savez vous quelles sont les commandes pour supprimer certaine colonne ?

    Répondre
  • Bonjour,

    Je cherche à lire des données en ligne dans un tableau csv afin d’obtenir la valeur d’une colonne en connaissant la valeur d’une autre colonne.
    Comment dois-je faire, s’il vous plait ?

    Répondre
    • Bonjour,
      Je n’ai pas trop compris… Vous souhaitez calculer une valeur à partir de la valeur d’une colonne existante ?
      Avez-vous un exemple ? 🙂

      Répondre
  • Bonjour
    Je fais un import de fichier csv pour alimenter un ad dans une des fonctions de mon script d’admin
    Cela marche bien
    Je souhaiterais pouvoir contrôler que le fichier csv est au bon format avant l’import.
    mes colonnes sont nommées et ne doivent pas changer de nom. Or si une colonne disparait du fichier csv (fausse manip par exemple) je n’ai pas de moyen de contrôle avant import dans l’AD.
    Comment contrôler que toute mes colonnes sont présentes et détiennent la bonne entête avant le déclenchement de l’import dans mon AD?

    Répondre
  • Bonjour,

    Peut-on a partit d’un fichier csv contenant plusieurs colonnes en fusionner 2 ex: passer de deux colonnes, Nom; Prénom à Nom Prénom. et sortir le résultat de toutes les colonnes originales + la fusion dans un nouveau CSV.
    Merci pour la réponse, je galère trop sur le sujet.

    Répondre

Répondre à Olivier Annuler la réponse

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.