Maîtrisez Import-Csv et d’autres commandes CSV dans PowerShell

Le cmdlet PowerShell Export-Csv et les cmdlets PowerShell Import-Csv permettent aux administrateurs d’importer des CSV via une boucle foreach, d’utiliser Export-Csv pour ajouter des CSV et exporter des tableaux vers un fichier CSV et bien plus encore.

Dans cet article, vous apprendrez de nombreux scénarios courants dans lesquels vous pouvez utiliser PowerShell pour gérer des CSV comme suit :

  • Lecture de fichiers CSV avec PowerShell
  • Enregistrement de fichiers CSV avec PowerShell
  • Formatage de la sortie avant d’exécuter Export-CSV
  • Ajout à un CSV
  • Ajout de différences à un fichier existant
  • Export-CSV et la chaîne #TYPE

Si vous n’êtes pas familier avec le fonctionnement interne des fichiers CSV, ce sont des fichiers texte qui suivent un format standard de séparation de virgules littérales de vos valeurs dans un tableau. Vous pouvez créer un fichier CSV en PowerShell en utilisant le cmdlet Export-Csv et en redirigeant un ou plusieurs objets vers celui-ci.

La commande ci-dessous trouve les deux premiers processus en cours d’exécution et passe les objets générés au cmdlet Export-Csv. Le cmdlet Export-Csv crée ensuite un fichier CSV appelé processes.csv à la racine de votre lecteur système (probablement C:\).

PS51> Get-Process | Select-Object -First 2 | Export-CSV -Path "$env:SystemDrive\processes.csv"

Ouvrez maintenant processes.csv avec le bloc-notes. Vous devriez voir "Nom","SI","Poignées","VM" en haut comme en-têtes. Vous verrez également #TYPE System.Diagnostics.Process, ce qui peut ne pas avoir beaucoup de sens pour le moment. Ne vous inquiétez pas, nous couvrirons cette chaîne dans cet article.

Lecture des fichiers CSV avec Import-Csv

Vous voulez plus de conseils comme celui-ci ? Consultez mon blog PowerShell personnel.

PowerShell dispose de quelques commandes qui vous permettent de lire des fichiers texte. Ces commandes sont Get-Content et Import-Csv. Chacune de ces deux cmdlets lit techniquement le fichier de la même manière. Mais Import-Csv va un peu plus loin. Import-Csv comprend la structure sous-jacente non seulement d’un fichier texte mais aussi d’un fichier CSV.

Étant donné qu’un fichier CSV suit un certain schéma, Import-Csv comprend le schéma CSV. Cette cmdlet ne lit pas seulement le fichier texte depuis le disque mais convertit également les lignes du fichier CSV en objets PowerShell.

Fichiers non CSV

Généralement, les données d’un CSV sont séparées par des virgules, mais il arrive parfois qu’un CSV (techniquement pas un CSV à ce stade) ait des données séparées par un autre délimiteur. Ces délimiteurs sont parfois une tabulation ou peut-être un point-virgule.

Si vous avez un fichier CSV avec un délimiteur différent, vous pouvez utiliser le paramètre Delimiter. Ce paramètre indique à Import-Csv de ne pas rechercher des virgules, ce qu’il fait par défaut, mais une autre valeur.

Par exemple, si vous avez un fichier séparé par des tabulations, vous pouvez lire le fichier comme suit :

PS51> Import-Csv -Path tab-separated-data.csv -Delimiter "`t"

Ajout d’en-têtes

A common Import-Csv parameter is Header. This parameter lets you specify the property names of the objects created by this cmdlet.

Par défaut, la cmdlet Import-Csv traitera la première ligne du fichier CSV comme des en-têtes. Elle convertira ensuite ces valeurs en propriétés de chaque ligne (objet). Mais si vous avez un fichier CSV sans ligne d’en-tête, vous pouvez utiliser le paramètre Header pour en définir un vous-même.

Le paramètre Header empêche Import-CSV d’utiliser votre première ligne comme en-tête et vous évite également des tracas en évitant d’ouvrir manuellement le fichier CSV pour ajouter des en-têtes.

Pour démontrer ce comportement, ouvrez le bloc-notes et copiez/collez le texte ci-dessous. Ce texte représentera un ensemble de données avec trois lignes et deux colonnes.

a,1
b,2
c,3

Enregistrez le fichier texte sous test.csv. N’oubliez pas d’activer les extensions de type de fichier ou d’encadrer le nom de fichier avec des guillemets doubles pour éviter de l’enregistrer accidentellement avec une extension de fichier se terminant par .csv.txt!

Maintenant, utilisez Import-CSV pour lire le fichier CSV récemment créé sans le paramètre Header et inspectez la sortie.

PS51> Import-Csv .\test.csv

a 1
---
b 2
c 3

Remarquez que la première ligne a été utilisée comme les propriétés de l’objet. A et 1 ne sont pas les « étiquettes » que vous voulez pour les propriétés de l’objet. A, b et c sont des lettres tandis que 1, 2 et 3 sont des nombres. Vous devez les définir avec le paramètre Header comme ci-dessous :

PS51> Import-Csv .\test.csv -Header "Letter", "Number"

Letter Number
------ ------
a      1
b      2
c      3

Enregistrer les fichiers CSV avec PowerShell

Si vous avez besoin de créer ou d’enregistrer un fichier CSV à partir d’objets PowerShell, vous pouvez également procéder autrement. Alors que la commande Import-Csv « convertit » un fichier CSV en objets PowerShell, Export-Csv fait l’inverse. Cette commande « convertit » des objets PowerShell en un fichier CSV.

En enregistrant un fichier CSV avec Export-Csv, vous pouvez ensuite consulter ou utiliser ultérieurement ces données dans d’autres systèmes.

Par exemple, je peux enregistrer tous les processus en cours sur mon ordinateur en transmettant Get-Process à la commande Export-Csv.

PS51> Get-Process | Export-Csv -Path processes.csv

La commande Export-Csv est simple en soi, mais il y a quelques pièges à éviter.

Formatage de la sortie avant d’exécuter Export-CSV

Comme vous l’avez vu précédemment, Export-Csv, par lui-même, effectue une conversion « brute ». Il n’ajoute aucun formatage de texte enrichi spécial, n’ajoute aucune couleur, etc.

Un des pièges les plus courants est de tenter d’améliorer l’apparence de la sortie avant de l’exporter vers un CSV. Beaucoup d’utilisateurs tenteront de rendre la sortie plus agréable avant de l’exporter vers un CSV. Mais je vais vous montrer que cela peut aggraver les choses.

Vous pouvez ouvrir un fichier CSV dans Microsoft Excel et mettre en italique, en gras, ajouter des couleurs et bien d’autres choses, mais si vous enregistrez le fichier en tant que CSV (plutôt qu’un classeur Excel), tout le formatage sera effacé. Un fichier CSV n’est tout simplement pas assez « intelligent ».

Rappelez-vous que les fichiers CSV ne sont que des fichiers texte simples avec des valeurs délimitées par des virgules (ou parfois des tabulations). Utiliser Import-Csv puis le diriger vers un cmdlet Format-* de PowerShell ne fonctionnera pas comme prévu.

Selon la documentation Microsoft Export-Csv : « Ne formatez pas les objets avant de les envoyer au cmdlet Export-CSV. Si Export-CSV reçoit des objets formatés, le fichier CSV contiendra les propriétés de format plutôt que les propriétés de l’objet. »

Pourquoi cela ?

Ouvrez une fenêtre PowerShell et créez des données factices. Utilisons l’exemple Get-Process abordé dans la première section de cet article. Mais cette fois, assignez la sortie à une variable. Ensuite, dirigez ces objets de processus vers le cmdlet Format-Table.

PS51> $a = Get-Process
PS51> $a | Format-Table
Using Format-Table

Vous pouvez voir qu’en utilisant Format-Table, vous avez maintenant une sortie propre et tabulaire.

Maintenant, enregistrez cette sortie dans une autre variable.

PS51> $b = $a | Format-Table

Visualisez maintenant les propriétés sur les valeurs des variables $a et $b avec Get-Member. Ce cmdlet vous aidera à comprendre pourquoi ces deux objets apparemment similaires ne sont pas exportés de la même manière dans un fichier CSV :

PS51> $a | Get-Member
System.Diagnostics.Process object type
PS51> $b | Get-Member
Format-Table‘s many object types

Le résultat direct de Get-Process est : TypeName: System.Diagnostics.Process, tandis que le résultat de Format-Table est complètement différent. Il renvoie de nombreux types différents avec des propriétés variables.

Si vous visualisez $a et $b dans la console, la sortie semblerait identique. Ce comportement est dû au système de mise en forme de PowerShell.

Comment cela affecte-t-il la sortie de Export-Csv?

PS51> $b | Export-Csv | Format-Table

Export-Csv lit chaque objet tel quel. Lorsque vous redirigez la sortie vers une cmdlet Format-*, vous modifiez l’entrée que Export-CSV reçoit. Cela affecte ensuite la sortie qui est enregistrée dans votre nouveau fichier CSV.

Si vous comptez rediriger la sortie vers la cmdlet Export-Csv, ne redirigez pas la sortie vers une cmdlet Format-*.

Rappelez-vous que les CSV se concentrent sur les données, pas sur la mise en forme.

Ajout à un fichier CSV

Parfois, vous pourriez avoir un fichier existant auquel vous voulez ajouter plutôt que d’en créer un entièrement nouveau. Par défaut, Export-Csv écrasera tout fichier spécifié via le paramètre Path.

Si vous devez ajouter des données à un CSV, utilisez le paramètre Append.

Supposons que vous ayez une boucle dans laquelle vous souhaitez sauvegarder chaque objet traité dans un fichier CSV. À chaque itération, vous avez un objet différent que vous aimeriez sauvegarder dans un fichier CSV. Comme vous appelez Export-Csv de manière répétée, cela écrasera le fichier CSV si vous n’utilisez pas le paramètre Append. Sans le paramètre Append, vous n’obtiendrez que le dernier objet, ce qui dans la plupart des cas n’est pas le résultat souhaité.

L’exemple ci-dessous recherche les cinq premiers processus en cours d’exécution. Ensuite, il entre dans une boucle foreach PowerShell Import-Csv et enregistre les propriétés Name et ProductVersion dans le fichier test.csv un par un.

Get-Process | Select-Object -First 5 | Foreach-Object {
    $_ | Select-Object Name, ProductVersion | Export-CSV -Path C:\test.csv -Append
}

Sans utiliser le paramètre Append, vous verrez que seul le cinquième processus apparaîtra dans le fichier CSV.

Ajout de Différences à un fichier CSV

Il est possible d’ajouter uniquement les différences de propriété à un fichier CSV existant avec Export-Csv. Cela signifie que si les colonnes d’une ligne CSV et l’objet à enregistrer sont différents, alors ajoutez-les.

Pour n’ajouter que les différences au fichier CSV, vous devrez utiliser les paramètres Append et Force ensemble. Selon la documentation Microsoft « Lorsque les paramètres Force et Append sont combinés, les objets contenant des propriétés incompatibles peuvent être écrits dans un fichier CSV. Seules les propriétés qui correspondent sont écrites dans le fichier. Les propriétés incompatibles sont ignorées. »

Pour démontrer, créez un objet avec deux propriétés; Nom et Âge.

PS51> $Content = [PSCustomObject]@{Name = "Johnny"; Age = "18"}

Créez maintenant un autre objet avec une propriété Nom et Code postal.

PS51> $OtherContent = [PSCustomObject]@{Name = "Joe"; Zip = "02195"}

Chaque objet a des propriétés différentes.

Ensuite, créez un fichier CSV à partir du premier objet, puis tentez d’ajouter le deuxième objet au CSV sans le paramètre Force. Vous recevrez une erreur.

PS51> $Content | Export-CSV -Path .\User.csv -NoTypeInformation
PS51> $OtherContent | Export-CSV -Path .\User.csv -NoTypeInformation -Append
Export-Csv without Force

Cependant, si vous utilisez le paramètre Force, Export-Csv fonctionnera parfaitement.

PS51> $OtherContent | Export-CSV -Path .\User.csv -NoTypeInformation -Append -Force

Cependant, vous remarquerez que la colonne Code postal a disparu dans le fichier CSV. Utilisez Force avec prudence. Il peut ne pas fournir la sortie prévue.

PS51> Import-Csv -Path .\User.csv

Name   Age
----   ---
Johnny 18
Joe

Export-CSV et la chaîne #TYPE

Par défaut, l’utilisation de Export-CSV sans paramètres supplémentaires inclura une chaîne #TYPE en haut de votre fichier CSV. Cette chaîne est ensuite suivie du type d’objet que Export-Csv a reçu.

#TYPE System.Diagnostics.Process

La plupart du temps, cette chaîne n’est pas réellement utile lors de la consommation de la sortie. Cette chaîne est uniquement là au cas où vous auriez besoin de maintenir le type d’objet à partir duquel les propriétés et les valeurs ont été extraites.

Pour supprimer cette chaîne, utilisez le paramètre NoTypeInformation. Ce paramètre supprime cette chaîne du CSV entièrement.

Notez qu’à partir de PowerShell Core, cela n’est plus nécessaire.

Résumé

En utilisant les cmdlets PowerShell Import-CSV et Export-CSV, vous pouvez facilement travailler avec des fichiers CSV. Ce sont deux cmdlets utiles que vous devriez utiliser fréquemment lorsque vous manipulez des objets et des fichiers CSV.

Mon espoir est qu’avec les explications et les exemples que j’ai présentés ici, vous pourrez comprendre clairement les situations où vous pouvez tirer parti de ces cmdlets à votre avantage.

Vous voulez plus de conseils comme celui-ci? Consultez mon blog personnel sur PowerShell.

Source:
https://adamtheautomator.com/import-csv/