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 faut utiliser le paramètre -Header et spécifier le nom de la ou des colonnes à sélectionner.

Voici un exemple pour sélectionner la colonne DossierSource :

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

Une autre manière de faire, même s'il faut préférer la syntaxe ci-dessus (plus performante), c'est d'utiliser Select-Object :

Import-CSV -Path "C:\TEMP\data.csv" -Delimiter ";" | Select-Object 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.

florian has 3272 posts and counting.See all posts by florian

Laisser un commentaire

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.