いくつか方法はありますが、すでに集計はできているようなので
既存の処理に追加でできる方法を。
一旦CSVの文字列に変換し、1行目 = ヘッダーを差し替えてしまう、という方法です。
列数が多く、その一部の見出しだけを変えたい場合はこの方法が楽だと思います。
(列番号を数値で指定している怖さはありますが)
powershell
1# $集計結果 に集計した結果を格納している前提
2[string]$csv出力先 = 'パス'
3
4# 一旦CSVの文字列に変換し、1行目(ヘッダー)とそれ以外に分離
5[string]$header, [string[]]$data =
6 $集計結果 |
7 ConvertTo-Csv -NoTypeInformation
8
9# ヘッダーを分割(簡易処理)
10[string[]]$newHeader = $header.Replace('"', '') -split ","
11$newHeader[0] = 'Countの代わりの名前'
12$newHeader[1] = 'Nameの代わりの名前'
13
14# ファイルに出力。
15@(
16 # ヘッダーを再連結
17 '"{0}"' -f ($newHeader -join '","')
18 $data
19) |
20 Out-File -LiteralPath $csv出力先 -Encoding default
上記以外の方法としては、出力したい見出し名のプロパティを持つPSCustomObject
を生成する方法があります。
CSV出力以外も想定するならこちらの方が汎用的ですが、列数が多い場合は工夫しないと修正が大変になります。
powershell
1# https://teratail.com/questions/228947
2
3# データの準備(サンプル用)
4[string]$csvFileTxt = @'
5name,a,b
6aaa,1,5
7bbb,20,6
8aaa,20,3
9'@
10$csvData = ConvertFrom-Csv -InputObject $csvFileTxt
11$groupData = $csvData | Group-Object -Property name
12
13# 見出しに設定する名前
14$Countの代わりの名前 = '個数'
15$Nameの代わりの名前 = '名前'
16
17# PowerShell 3 以降なら [PSCustomObject]@{} で作るのが楽。
18$aggregateData1 = $groupData |
19 ForEach-Object -Process {
20 [PSCustomObject]@{
21 $Countの代わりの名前 = $_.Count
22 $Nameの代わりの名前 = $_.Name
23 'a' = ($_.Group | Measure-Object -Property a -Sum).Sum
24 'b' = ($_.Group | Measure-Object -Property b -Sum).Sum
25 }
26 }
27$aggregateData1 | Format-Table
28
29# PowerShell 2 (Windows 7)なら PSCustomObjectの生成はSelect-Object あたりが候補。
30$aggregateData2 = $groupData |
31 ForEach-Object -Process {
32 # Name と Expression というキーを持ったハッシュテーブルの配列を
33 # Propertyパラメータに渡すと、Nameの値の名前で、Expressionのスクリプトブロックの評価結果の値のプロパティをもつ
34 # PSCustomObject が作成される。
35 Select-Object -InputObject $_ -Property @(
36 @{Name = $Countの代わりの名前; Expression = {$_.Count}}
37 @{N = $Nameの代わりの名前; E = {$_.Name}} <# NameはN、ExpressionはEに省略可能 #>
38 @{N = 'a'; E ={($_.Group | Measure-Object -Property a -Sum).Sum}}
39 @{N = 'b'; E ={($_.Group | Measure-Object -Property b -Sum).Sum}}
40 )
41 }
42$aggregateData2 | Format-Table