見出し画像

#としじのPS その23~練習問題15:クロス集計~

#としじのPS その23~練習問題15:クロス集計~ 

PSでクロス集計、やったことない
ちょっとググったけどそれらしい記事も見当たらず、やりようはあるはずですけどね・・・
一旦パスします、あとで追記するかも、ひとまずやったところまで
あ、CSVの名前をスクリプトの名前と同じにしてるのでいちいち書き換えなくてもいいようにしてあります、本筋とは関係ないけども

cls; cd C:\PowerShell

$csvfilename = (ls $MyInvocation.MyCommand.Name).BaseName + ".csv"
$csv = Import-Csv $csvfilename -Encoding Default

$names = ($csv | group 支店).Name
$csv | group 分類

画像1

追記

力業で実装できたので記載しておきます

cls; cd C:\PowerShell

$csvfilename = (ls $MyInvocation.MyCommand.Name).BaseName + ".csv"
$csv = Import-Csv $csvfilename -Encoding Default

$分類 = ($csv | group 分類).Name | sort
$支店 = ($csv | group 支店).Name | sort

$arr = New-Object "object[,]" ($分類.Count+1),($支店.Count+1)
$arr[0,0]="分類"
1..$分類.Count | % { $arr[$_,0] = $分類[$_-1] }
1..$支店.Count | % { $arr[0,$_] = $支店[$_-1] }
$csv | % {
   $arr[($分類.IndexOf($_.分類)+1),($支店.IndexOf($_.支店)+1)] += [int]$_.売上
}

.{
   for ($i = 0; $i -le $分類.Count; $i++){ 
       $line = ""
       for ($j = 0; $j -le $支店.Count; $j++){ 
           $line += ("`t" + $arr[$i,$j])
       }
       $line.Substring(1)
   }
} | ConvertFrom-Csv -Delimiter "`t" | ogv -Title "クロス集計"

画像4

画像2

一応エクセルのピボットテーブルで確かめてみた、大丈夫そう

画像3

おまけ

表形式にまとめなくていいのであればこんなのがお手軽です

画像5

画像6


この記事が気に入ったらサポートをしてみませんか?