web-dev-qa-db-fra.com

Ajouter une colonne à Windows PowerShell au format CSV

J'ai un fichier csv assez standard avec des en-têtes. Je veux ajouter une nouvelle colonne et définir toutes les lignes avec les mêmes données.

Original:

column1, column2
1,b
2,c
3,5

Après

column1, column2, column3
1,b, setvalue
2,c, setvalue
3,5, setvalue

Je ne trouve rien à ce sujet si quelqu'un pouvait me diriger dans la bonne direction, ce serait formidable. Désolé très nouveau à Power Shell.

16
Paul

Voici un moyen de le faire en utilisant les propriétés calculées:

Import-Csv file.csv | 
Select-Object *,@{Name='column3';Expression={'setvalue'}} | 
Export-Csv file.csv -NoTypeInformation

Vous trouverez plus d'informations sur les propriétés calculées ici: http://technet.Microsoft.com/en-us/library/ff730948.aspx

En un mot, vous importez le fichier, dirigez le contenu vers l'applet de commande Select-Object, sélectionnez toutes les propriétés existantes (par exemple, *), puis ajoutez-en une nouvelle.

37
Shay Levy

La réponse de ShayLevy fonctionne également pour moi!

Si vous ne voulez pas encore donner de valeur à chaque objet, le code est encore plus simple ...

Import-Csv file.csv | 
Select-Object *,"column3" | 
Export-Csv file.csv -NoTypeInformation
8
Wouter Speybrouck

Pour certaines applications, j'ai constaté que produire une table de hachage et utiliser le .values comme colonne était bon (cela permettrait la validation des références croisées avec un autre objet énuméré).

Dans ce cas, #powershell sur freenode a attiré mon attention sur une hashtable ordonnée (puisque l'en-tête de colonne doit être utilisé).

Voici un exemple sans validation du .values

$newcolumnobj =  [ordered]@{}
#input data into a hash table so that we can more easily reference the `.values` as an object to be inserted in the CSV
$newcolumnobj.add("volume name", $currenttime)

#enumerate $deltas [this will be the object that contains the volume information `$volumedeltas`)
#  add just the new deltas to the newcolumn object
foreach ($item in $deltas){ 
  $newcolumnobj.add($item.volume,$item.delta)
}

$originalcsv = @(import-csv $targetdeltacsv)

#thanks to pscookiemonster in #powershell on freenode
for($i=0; $i -lt $originalcsv.count; $i++){
  $originalcsv[$i] | Select-Object *, @{l="$currenttime"; e={$newcolumnobj.item($i)}}
}

L'exemple est lié à Comment puis-je effectuer une arithmétique pour trouver des différences de valeurs dans deux CSV?

0
mbrownnyc