タイダログ

もっと怠けますか? (y/n)

PowerShell 誕生祭 2021

f:id:taidalog:20211114231514p:plain
Happy Birthday

f:id:taidalog:20211114213535p:plain
Windows PowerShell

PowerShell、お誕生日おめでとう!

11月14日は PowerShell のお誕生日です。2006年生まれだそうですので今日で15歳ですね。今後ともよろしくね。

ところで15歳と言えばシンジ君とほぼ同い年です。みんな大好き VBA は1993年生まれの28歳だそうですので、ミサトさんです。普段お世話になっている言語の年齢からエヴァに話が波及するとは、世の中何があるか分からないものですね。

ところで、VBA のバージョンは 7.1 で止まっています。一方の PowerShell は先日 7.2 が出ましたよね。VBA の半分しか生きていない PowerShell が、先輩のバージョンを、成長を、追い越したわけですよ。なんというかこう、ミサトさんの想いを受け取ったシンジ君が前に進んでいくみたいなことを思うと、涙がこぼれてしまいました。

これが…涙…?

CSV から棒グラフを作るワンライナー

せっかくひと月ぶりに筆を執ったので、この間に PowerShell と遊んだ記録を残そうと思います。CSV ファイルのデータを PowerShell で読み込んで、簡単な棒グラフを作ります。数値を肉眼で確認しろと言われたら「無理だよそんなの! できるわけないよ!」と答えることにしている私には必須のスキルです。

Excel で開いて COUNTIF? 今日の主役は PowerShell だからね。

ここに CSV のデータがあるだなも。

"Color","ItemType"
"青","素材"
"緑","家具"
"緑","服"
"赤","服"
"黄","服"
"赤","レシピ"
"黄","ベル"
"青","レシピ"
"赤","レシピ"
(略)

それをこのワンライナーで、

Import-Csv -Path .\balloon.csv -Encoding UTF8 | Group-Object -Property Color, ItemType | Select-Object -Property Name, Count, @{ label="BarChart"; expression={ "*" * $_.Count } } | Sort-Object -Property Name

こう。

Name       Count BarChart
----       ----- --------
黄, ベル      14 **************
黄, レシピ     3 ***
黄, 家具       3 ***
黄, 服         3 ***
青, レシピ     5 *****
青, 家具       4 ****
青, 素材      16 ****************
青, 服         4 ****
赤, レシピ     3 ***
赤, 家具      13 *************
赤, 服         6 ******
緑, レシピ     6 ******
緑, 家具       4 ****
緑, 服         6 ******

こうすると、

Import-Csv -Path .\balloon.csv -Encoding UTF8 | Group-Object -Property ItemType, Color | Select-Object -Property Name, Count, @{ label="BarChart"; expression={ "*" * $_.Count } } | Sort-Object -Property Name

こう。

Name       Count BarChart
----       ----- --------
ベル, 黄      14 **************
レシピ, 黄     3 ***
レシピ, 青     5 *****
レシピ, 赤     3 ***
レシピ, 緑     6 ******
家具, 黄       3 ***
家具, 青       4 ****
家具, 赤      13 *************
家具, 緑       4 ****
素材, 青      16 ****************
服, 黄         3 ***
服, 青         4 ****
服, 赤         6 ******
服, 緑         6 ******

説明

以下のコードを、「1行目だけ→2行目まで→3行目まで→4行目まで」という風に1行ずつ増やしながら順に実行したらわかると思います。

データは「CSV から棒グラフを作るワンライナー」の冒頭のデータを参考に適当に作って適当なディレクトリに置いてください。そのディレクトリに cd したら準備万端です。

Import-Csv -Path .\balloon.csv -Encoding UTF8 | 
    Group-Object -Property Color, ItemType | 
    Select-Object -Property Name, Count, @{ label="BarChart"; expression={ "*" * $_.Count } } | 
    Sort-Object -Property Name
  1. CSV をインポート
  2. グループ化
  3. グループ化した結果から必要な情報を取り出す
  4. グループ化した結果を Name でソート

2行目では、Color 別で分けて、その中で ItemType 別にしています。 ItemType, Color とすればその順番になります。

3行目の @{ label="BarChart"; expression={ "*" * $_.Count } } は 'calculated properties' というやつです。これまでにも取り上げています。「そのグループの Count の数だけ '*' を表示する」ということをしています。

taidalog.hatenablog.com

結び

何とか11月14日中に公開できました。ギリギリセーフね!

謝辞

トップのケーキの画像は、以下のサイトのものです。
夏のパーティーブルー系イラスト - No: 22059005/無料イラストなら「イラストAC」

トップの Windows PowerShell のアイコン画像は、以下のサイトのものです。
Windows で開発環境を設定する | Microsoft Docs

ありがとうございました。