乃木坂46で学ぶ PowerShell で CSV 分析

# PowerShell 基本コマンド

| コマンド       | エイリアス | 概要                           |
| -------------- | ---------- | ------------------------------ |
| Import-Csv     | ipcsv      | CSV ファイルをインポートする   |
| Export-Csv     | epcsv      | CSV ファイルをエクスポートする |
| Format-List    | fl         | リスト型で表示する             |
| Format-Table   | ft         | テーブル型で表示する           |
| ForEach-Object | %          | 各オブジェクトに処理を実行する |
| Where-Object   | ?          | 条件に一致する行を抽出する     |
| Select-Object  | select     | 条件に一致する列を抽出する     |
| Group-Object   | group      | グループごとに集計する         |
| Sort-Object    | sort       | オブジェクトを並び替える       |
| Measure-Object | measure    | 行数を取得する                 |

# 練習用 csv データ

以下の csv をローカルに保存してください。

```nogizaka46.csv
"名前","なまえ","出身地","血液型","身長","期生"
"秋元真夏","あきもとまなつ","埼玉県","B","154","1"
"生田絵梨花","いくたえりか","東京都","A","160","1"
"井上小百合","いのうえさゆり","埼玉県","B","156","1"
"衛藤美彩","えとうみさ","大分県","AB","163","1"
"川後陽菜","かわごひな","長崎県","O","161","1"
"齋藤飛鳥","さいとうあすか","東京都","O","158","1"
"斉藤優里","さいとうゆうり","東京都","O","157","1"
"桜井玲香","さくらいれいか","神奈川県","A","155","1"
"白石麻衣","しらいしまい","群馬県","A","162","1"
"高山一実","たかやまかずみ","千葉県","A","162","1"
"中田花奈","なかだかな","埼玉県","A","158","1"
"西野七瀬","にしのななせ","大阪府","O","159","1"
"能條愛未","のうじょうあみ","神奈川県","A","162","1"
"樋口日奈","ひぐちひな","東京都","A","159","1"
"星野みなみ","ほしのみなみ","千葉県","B","155","1"
"松村沙友理","まつむらさゆり","大阪府","B","164","1"
"若月佑美","わかつきゆみ","静岡県","O","157","1"
"和田まあや","わだまあや","広島県","O","160","1"
"伊藤かりん","いとうかりん","神奈川県","O","153","2"
"伊藤純奈","いとうじゅんな","神奈川県","A","166","2"
"北野日奈子","きたのひなこ","北海道","O","158","2"
"佐々木琴子","ささきことこ","埼玉県","A","163","2"
"新内眞衣","しんうちまい","埼玉県","B","165","2"
"鈴木絢音","すずきあやね","秋田県","O","160","2"
"寺田蘭世","てらだらんぜ","東京都","不明","155","2"
"堀未央奈","ほりみおな","岐阜県","O","160","2"
"山崎怜奈","やまざきれな","東京都","B","164","2"
"渡辺みり愛","わたなべみりあ","東京都","O","153","2"
"伊藤理々杏","いとうりりあ","沖縄県","B","154","3"
"岩本蓮加","いわもとれんか","東京都","B","157","3"
"梅澤美波","うめざわみなみ","神奈川県","A","170","3"
"大園桃子","おおぞのももこ","鹿児島県","O","156","3"
"久保史緒里","くぼしおり","宮城県","O","159","3"
"阪口珠美","さかぐちたまみ","東京都","A","161","3"
"佐藤楓","さとうかえで","愛知県","A","161","3"
"中村麗乃","なかむられの","東京都","不明","167","3"
"向井葉月","むかいはづき","東京都","A","152","3"
"山下美月","やましたみづき","東京都","O","159","3"
"吉田綾乃クリスティー","よしだあやのクリスティー","大分県","A","161","3"
"与田祐希","よだゆうき","福岡県","O","152","3"
"山本穂乃香","やまもとほのか","愛知県","O","162","1"
"吉本彩華","よしもとあやか","熊本県","A","147","1"
"岩瀬佑美子","いわせゆみこ","埼玉県","A","153","1"
"安藤美雲","あんどうみくも","神奈川県","O","156","1"
"柏幸奈","かしわゆきな","神奈川県","B","158","1"
"宮澤成良","みやざわせいら","千葉県","O","166","1"
"市來玲奈","いちきれな","千葉県","A","153","1"
"伊藤寧々","いとうねね","岐阜県","B","148","1"
"大和里菜","やまとりな","宮城県","O","162","1"
"畠中清羅","はたなかせいら","大分県","B","150","1"
"松井玲奈","まついれな","愛知県","O","162","交換留学生"
"永島聖羅","ながしませいら","愛知県","O","158","1"
"深川麻衣","ふかがわまい","静岡県","O","162","1"
"橋本奈々未","はしもとななみ","北海道","B","163","1"
"中元日芽香","なかもとひめか","広島県","O","161","1"
"伊藤万理華","いとうまりか","神奈川県","O","156","1"
"川村真洋","かわむらまひろ","大阪府","A","157","1"
"生駒里奈","いこまりな","秋田県","AB","154","1"
"斎藤ちはる","さいとうちはる","埼玉県","A","166","1"
"相楽伊織","さがらいおり","埼玉県","O","164","2"
"西川七海","にしかわななみ","東京都","A","165","2"
"矢田里沙子","やだりさこ","埼玉県","A","158","2"
"米徳京花","よねとくきょうか","神奈川県","AB","163","2"
```

# 1. ファイルの読み込み

`Import-Csv` で csv ファイルを読み込みます。

```
$nogizaka = Import-Csv -Delimiter "," -Encoding UTF8 -LiteralPath .\nogizaka46.csv
$nogizaka

名前   : 秋元真夏
なまえ : あきもとまなつ
出身地 : 埼玉県
血液型 : B
身長   : 154
期生   : 1

名前   : 生田絵梨花
なまえ : いくたえりか
出身地 : 東京都
血液型 : A
身長   : 160
期生   : 1

名前   : 井上小百合
なまえ : いのうえさゆり
出身地 : 埼玉県
血液型 : B
身長   : 156
期生   : 1

(以下略)
```

# 1'. (参考) ヘッダがないファイルの読み込み

ちなみに、csv ファイルにヘッダがない場合は、`-Header` オプションで設定することができます。

```
$nogizaka = Import-Csv -Delimiter "," -Encoding UTF8 -LiteralPath .\nogizaka46_header.csv -Header "名前","なまえ","出身地","血液型","身長","期生"
$nogizaka
```

# 1''. (参考) 表示形式の指定

`Format-List` か `Format-Table` で表示形式を指定します。

```
$nogizaka = Import-Csv -Delimiter "," -Encoding UTF8 -LiteralPath .\nogizaka46.csv
$nogizaka | Format-List

名前   : 秋元真夏
なまえ : あきもとまなつ
出身地 : 埼玉県
血液型 : B
身長   : 154
期生   : 1
(以下略)
```

```
$nogizaka | Format-Table

名前                 なまえ                   出身地   血液型 身長 期生
----                 ------                   ------   ------ ---- ----
秋元真夏             あきもとまなつ           埼玉県   B      154  1
生田絵梨花           いくたえりか             東京都   A      160  1
井上小百合           いのうえさゆり           埼玉県   B      156  1
(以下略)
```

# 2. 行の抽出

`Where-Object` で特定の条件に一致する行を抽出します。例では、1 期生だけを抽出しています。

```
$greped = $nogizaka | Where-Object -Property 期生 -EQ -Value "1"
$greped

名前   : 秋元真夏
なまえ : あきもとまなつ
出身地 : 埼玉県
血液型 : B
身長   : 154
期生   : 1

名前   : 生田絵梨花
なまえ : いくたえりか
出身地 : 東京都
血液型 : A
身長   : 160
期生   : 1

名前   : 井上小百合
なまえ : いのうえさゆり
出身地 : 埼玉県
血液型 : B
身長   : 156
期生   : 1

(以下略)
```

# 3. 列の抽出

`Select-Object` で特定の条件に一致する列を抽出します。例では、名前・身長・期生を抽出しています。なお、`-Unique` オプションで重複を削除することができます。

```
$selected = $greped | Select-Object -Property 名前,身長,期生
$selected

名前       身長 期生
----       ---- ----
秋元真夏   154  1
生田絵梨花 160  1
井上小百合 156  1
衛藤美彩   163  1
川後陽菜   161  1
齋藤飛鳥   158  1
斉藤優里   157  1
桜井玲香   155  1
白石麻衣   162  1
高山一実   162  1
中田花奈   158  1
西野七瀬   159  1
能條愛未   162  1
樋口日奈   159  1
星野みなみ 155  1
松村沙友理 164  1
若月佑美   157  1
和田まあや 160  1
山本穂乃香 162  1
吉本彩華   147  1
岩瀬佑美子 153  1
安藤美雲   156  1
柏幸奈     158  1
宮澤成良   166  1
市來玲奈   153  1
伊藤寧々   148  1
大和里菜   162  1
畠中清羅   150  1
永島聖羅   158  1
深川麻衣   162  1
橋本奈々未 163  1
中元日芽香 161  1
伊藤万理華 156  1
川村真洋   157  1
生駒里奈   154  1
斎藤ちはる 166  1
```

# 4. 並び替え

`Sort-Object` で特定の列をキーとして並び替えます。例では、身長をキーとして降順に並び替えています。

```
$sorted = $selected | Sort-Object -Property 身長 -Descending
$sorted

名前       身長 期生
----       ---- ----
宮澤成良   166  1
斎藤ちはる 166  1
松村沙友理 164  1
橋本奈々未 163  1
衛藤美彩   163  1
高山一実   162  1
山本穂乃香 162  1
大和里菜   162  1
能條愛未   162  1
深川麻衣   162  1
白石麻衣   162  1
川後陽菜   161  1
中元日芽香 161  1
和田まあや 160  1
生田絵梨花 160  1
西野七瀬   159  1
樋口日奈   159  1
柏幸奈     158  1
齋藤飛鳥   158  1
永島聖羅   158  1
中田花奈   158  1
斉藤優里   157  1
若月佑美   157  1
川村真洋   157  1
井上小百合 156  1
安藤美雲   156  1
伊藤万理華 156  1
星野みなみ 155  1
桜井玲香   155  1
生駒里奈   154  1
秋元真夏   154  1
岩瀬佑美子 153  1
市來玲奈   153  1
畠中清羅   150  1
伊藤寧々   148  1
吉本彩華   147  1
```

# 5. ファイルの出力

`Export-Csv` で csv ファイルとして出力することができます。

```
$sorted | Export-Csv -Delimiter "," -Encoding UTF8 -LiteralPath .\out.csv -NoTypeInformation
```

# 6. グループ集計

`Group-Object` でグループごとに集計します。例では、血液型ごとに集計しています。

```
$grouped = $nogizaka | Group-Object -Property 血液型 -NoElement
$sorted = $grouped | Sort-Object -Property Count -Descending
$sorted

Count Name
----- ----
   25 O
   21 A
   12 B
    3 AB
    2 不明
```

# 7. 行数の抽出

`Measure-Object` で行数の抽出します。例では、1 期生の人数を集計しています。

```
$greped = $nogizaka | Where-Object -Property 期生 -EQ -Value "1"
$measured = $greped | Measure-Object
$measured

Count    : 36
Average  :
Sum      :
Maximum  :
Minimum  :
Property :
```