Comment lire le contenu d’un fichier CSV avec PowerShell ?
Sommaire
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 :

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.
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.
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
bonjour
après exportation en fichier csv, savez vous quelles sont les commandes pour supprimer certaine colonne ?
Bonjour Olivier,
Est-ce que vous avez trouvé une solution ?
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 ?
Bonjour,
Je n’ai pas trop compris… Vous souhaitez calculer une valeur à partir de la valeur d’une colonne existante ?
Avez-vous un exemple ? 🙂
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?
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.