Help us understand the problem. What is going on with this article?

PowerShell で、多項目中、複数項目の数の集計

More than 3 years have passed since last update.

20160701

または、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
#   }
# }

なんてお茶を濁す作業。

追記

ヘッダ無しの場合のコード。ヘッダありの場合は、yumura_sさんのご指摘通り、一発ですね。

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" 文字列が長くなると後半が切れてしまって悲惨なことになる。
    • Format-Table -Autosize で、切れなくは出来る。

試行錯誤中だった時のスクリプト

まあ、配列の作り方やらを備忘しとくのに。

$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

なんぞ書く。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした