web-dev-qa-db-ja.com

CSV Windows PowerShellに列を追加

新しい列を追加し、すべての行を同じデータに設定したいヘッダーを持つかなり標準的なcsvファイルがあります。

元の:

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

後に

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

誰かが私を正しい方向に向けることができれば、これについては何も見つかりません。 Power Shellが初めての方はごめんなさい。

16
Paul

計算プロパティを使用してこれを行う1つの方法を次に示します。

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

計算されたプロパティの詳細については、 http://technet.Microsoft.com/en-us/library/ff730948.aspx を参照してください。

簡単に言うと、ファイルをインポートし、コンテンツをSelect-Objectコマンドレット、既存のすべてのプロパティ(例: '*')を選択してから、新しいプロパティを追加します。

40
Shay Levy

ShayLevyの答えも私には有効です!

各オブジェクトに値を指定したくない場合でも、コードはさらに簡単です...

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

一部のアプリケーションでは、ハッシュテーブルを作成し、.valuesを列として使用するとよいことがわかりました(列挙されている別のオブジェクトに対する相互参照検証が可能になります)。

この場合、freenodeの#powershellは、順序付けられたハッシュテーブルに注意を向けました(列ヘッダーを使用する必要があるため)。

.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)}}
}

例は 2つのCSVの値の違いを見つけるために算術を実行するにはどうすればよいですか?

0
mbrownnyc