1. bunzaemon

    Posted

    bunzaemon
Changes in title
+PowerShell で、多項目中、複数項目の数の集計
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,138 @@
+
+または、`PowerShell` で `(sort |) uniq -c`
+
+多分もっといい計算方法があるはず。
+
+## やりたいこと
+
+|名前|教科|点数|コメント|
+|:--|:--|:--|:--|
+|A|国語|100|-|
+|B|国語|90|-|
+|C|国語|90|-|
+|A|理科|50|-|
+|B|理科|70|-|
+|C|理科|70|-|
+
+`csv` でこんなのが山ほどあるとして、各教科で各点数が何名いるか集計したい場合。
+
+つまり、`perl` でなら
+
+```
+$ perl -MTest::More -F, -lane '$a->{$F[1]}->{$F[2]} ++ }{ note explain $a' test.csv
+# {
+# '国語' => {
+# '100' => 1,
+# '90' => 2
+# },
+# '理科' => {
+# '50' => 1,
+# '70' => 2
+# }
+# }
+```
+
+なんてお茶を濁す作業。
+
+
+## `PowerShell` にて
+
+Dos窓で、
+
+```
+> powershell
+PS > cd bar
+```
+
+`PowerShell` を起動して、目的のファイルがあるところまで `cd`
+
+### ワンライナー
+
+日本語交じりなら、Shift-jis で。
+
+**A**
+
+```
+PS > cat test.csv | %{ $a = $_.split(",") ; $a[1], $a[2] -join "," } | group $_ | select name, count
+Name Count
+---- -----
+国語,100 1
+国語,90 2
+理科,50 1
+理科,70 2
+```
+
+**B**
+
+```
+PS > cat test.csv | %{ $a = $_.split(",") ; $a[1], $a[2] -join "," } | group -NoElement
+Count Name
+----- ----
+1 国語,100
+2 国語,90
+1 理科,50
+2 理科,70
+```
+
+- `sort` を付けたければ、各ワンライナーのあとに工夫して。
+- A, B に違いが無いように見えるが、 B は、"Name" 文字列が長くなると後半が切れてしまって悲惨なことになる。
+
+#### 試行錯誤中だった時のスクリプト
+
+まあ、配列の作り方やらを備忘しとくのに。
+
+
+```
+$list= (Get-Content test.csv | %{ $a = $_.split(",") ; $a[1], $a[2] -join "," } )
+foreach ( $item in ( $list | sort -Unique ) ){
+ $d = ( $list | Select-String -SimpleMatch $item | Measure-Object ).Count
+ Write-Output ( $item, $d -join "," )
+}
+```
+
+## ごくごく初歩のメモ
+
+どうせ、しばらく使わないので、メモっとく
+
+### PowerShell の設定
+
+ドス窓ひらいて、
+
+```
+> powershell
+```
+
+て打って、文句言われたら、`Set-ExecutionPolicy -Scope CurrentUser` あたりを打ち込む
+
+### Powershell のコマンド
+
+正式名称は長いけど、エイリアスが貼ってあるので、 `cd`, `ls`, `cat`, `more` あたりは、似たような感じで使える。
+
+### pbcopy
+
+`clip`
+
+日本語を扱う場合は、 `$outputencoding=[console]::outputencoding` 貼り付けてから実行するが吉
+
+`Set-Clipboard` は、面倒そう
+
+### pbpaste
+
+`Get-Clipboard`
+
+### *shrc
+
+```
+PS >New-item –type file –force $profile
+```
+
+しといて、できたファイルに
+
+```
+$outputencoding=[console]::outputencoding
+New-Alias pbpaste Get-Clipboard
+New-Alias pbcopy clip
+```
+
+なんぞ書く。
+