23/11/2024

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

I. Présentation

Dans ce chapitre, nous allons voir comment manipuler le cmdlet "Import-CSV" pour lire et exploiter le contenu d'un fichier CSV à l'aide de PowerShell. Autrement dit, nous allons importer un fichier CSV pour pouvoir exploiter dans les données présentes dans ce fichier.

II. Qu'est-ce qu'un fichier CSV ?

Avant de commencer à manipuler un fichier CSV avec PowerShell, rappelons déjà ce qu'est le format de fichier CSV. Le format CSV, qui signifie Comma Separated Values, valeurs séparées par des virgules en français, est un format de fichier universel, en mode texte, très simple à utiliser et très pratique pour stocker des données sans appliquer de formatage.

Les fichiers CSV sont constitués de plusieurs lignes, et chaque ligne représente un enregistrement de données. La première ligne sert à représenter les en-têtes, c'est-à-lire les noms de colonnes, ce qui correspondra aux noms des propriétés de notre futur objet PowerShell.

Chaque enregistrement contient un ou plusieurs champs (colonnes, si vous préférez), séparés par un caractère que l'on appelle le séparateur. Le séparateur officiel est la virgule, mais vous pouvez également utiliser un autre caractère, comme un point-virgule, un espace ou une tabulation.

Aujourd'hui, un fichier CSV peut être lu aussi bien avec PowerShell qu'avec une application telle que Microsoft Excel, ce qui en fait un format très pratique. De nombreuses applications métiers permettent d'exporter des données au format CSV : la liste du personnel, par exemple.

De ce fait, lorsque nous sommes amenés à réaliser des scripts 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 un script. Par exemple, nous pouvons utiliser un fichier CSV qui contient des informations sur le personnel de l'entreprise afin de l'utiliser comme source de données pour créer les comptes Active Directory. Ce cas de figure a été traité dans notre cours dédié à l'administration de l'Active Directory avec PowerShell.

III. Utilisation de la commande Import-CSV

Pour manipuler le cmdlet Import-Csv, nous allons prendre l'exemple suivant : un fichier CSV avec deux colonnes, la première colonne nommée "DossierSource" et la seconde nommée "DossierDestination". Nous pouvons 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

Ce contenu est enregistré dans le fichier "C:\TEMP\data.csv", au format "CSV", c'est-à-dire avec l'extension ".csv". Désormais, comment allons nous faire pour lire et exploiter le contenu de ce fichier ?

Pour importer les données du fichier CSV, PowerShell intègre un cmdlet prêt à l'emploi : "Import-CSV". Au niveau des paramètres, il y en a trois qui sont particulièrement intéressants (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 point-virgule dans notre cas
  • -Encodage pour préciser l'encodage du fichier (si nécessaire, notamment pour la prise en charge des caractères accentués).
Import-CSV -Path "C:\TEMP\data.csv" -Delimiter ";"

Le contenu du fichier CSV doit s'afficher dans la console. Voici ce que nous obtenons :

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" que nous avons étudiés dans un précédent chapitre :

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

Contrairement à ce que nous pouvons penser, le paramètre "-Header" de "Import-Csv" 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".

Remarque : pour déterminer quel est le délimiteur utilisé par un fichier CSV, il suffit de l'ouvrir puis de regarder la syntaxe de la première ligne.

IV. 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, nous devons commencer par affecter son contenu dans une variable. Par exemple, la variable nommée "$CSV" :

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

Ensuite, si nous affichons le contenu de $CSV, nous devrions voir le contenu de notre 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, nous allons appliquer un filtre avec "Where-Object".

$CSV = Import-CSV -Path "C:\TEMP\data.csv" -Delimiter ";" | Where-Object { $_.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>
}

À 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", nous précisons simplement son nom, car c'est devenu une propriété de notre objet.

$Ligne.DossierSource

Nous pouvons essayer avec cette boucle (aucun risque parce qu'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, nous allons 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. Nous pourrions aussi améliorer la gestion des erreurs avec "Try-Catch".

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


livre pour apprendre PowerShell
author avatar
Florian BURNEL Co-founder of IT-Connect
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.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

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.