前回までで、棒グラフと円グラフを1つのPowerShellスクリプトから生成できるようになった。今回は、元データとしてCSVに加えTSVにも対応する方法を考える。これもリファインのサンプルとして面白い題材なので、参考にしていただきたい。

→連載「PowerShell Core入門 - 基本コマンドの使い方」の過去回はこちらを参照。

TSVファイルからcsv2chart.ps1を使ってグラフを生成する

まず、前回までの成果物「csv2barchart.ps1」を確認しよう。

#!/usr/bin/env pwsh

#========================================================================
# 引数を処理
#   -CSVFile パス             グラフのCSVデータファイルパス
#   -PNGFile パス             生成するPNG画像のファイルパス
#   -OutFile パス             中間生成されるHTMLファイルパス
#   -GraphTitle タイトル        グラフのタイトル
#   -Width 幅                        生成するPNG画像の幅
#   -Height 高さ              生成するPNG画像の高さ
#========================================================================
Param(
    [Parameter(Mandatory=$true)][String]$CSVFile,
    [String]$PNGFile = (Get-Location).ToString() + '\out.png',
    [String]$OutFile = (Get-Location).ToString() + '\out.html',
    [String]$GraphTitle = 'グラフ',
    [Int]$Width = 2000,
    [Int]$Height = 1200
)

#========================================================================
# csv2chart.ps1を使ってグラフを生成
#========================================================================
csv2chart.ps1                                                       `
    -CSVFile        $CSVFile                                        `
    -PNGFile        $PNGFile                                        `
    -GraphTitle     $GraphTitle                                     `
    -Width          $Width                                          `
    -Height         $Height                                         `
    -GraphType      'Bar'

csv2barchart.ps1

#!/usr/bin/env pwsh

#========================================================================
# 引数を処理
#   -CSVFile パス             グラフのCSVデータファイルパス
#   -PNGFile パス             生成するPNG画像のファイルパス
#   -OutFile パス             中間生成されるHTMLファイルパス
#   -GraphTitle タイトル        グラフのタイトル
#   -Width 幅                        生成するPNG画像の幅
#   -Height 高さ              生成するPNG画像の高さ
#========================================================================
Param(
    [Parameter(Mandatory=$true)][String]$CSVFile,
    [String]$PNGFile = (Get-Location).ToString() + '\out.png',
    [String]$OutFile = (Get-Location).ToString() + '\out.html',
    [String]$GraphTitle = 'グラフ',
    [Int]$Width = 2000,
    [Int]$Height = 1200
)

#========================================================================
# csv2chart.ps1を使ってグラフを生成
#========================================================================
csv2chart.ps1                                                       `
    -CSVFile        $CSVFile                                        `
    -PNGFile        $PNGFile                                        `
    -GraphTitle     $GraphTitle                                     `
    -Width          $Width                                          `
    -Height         $Height                                         `
    -GraphType      'Pie'

csv2chart.ps1が本体であり、上記の「csv2barchart.ps1」と「csv2barchart.ps1」がラッパースクリプトになっている。これに対し、今回からはcsv2chart.ps1を使って「tsv2barchart.ps1」と「tsv2piechart.ps1」を作ろうというわけだ。

これまでと同じアプローチを取るのであれば、「tsv2barchart.ps1」と「tsv2piechart.ps1」にそれぞれ、TSVファイルをCSVファイルに変換する処理を加え、そこからcsv2chart.ps1を呼び出せばよいということになる。

より汎用化させた「data2chart.ps1」を作る

しかし、ここで前回や前々回で取り組んできた内容を考える必要がある。先ほどのアプローチを取った場合、「tsv2barchart.ps1」と「tsv2piechart.ps1」に「TSVファイルをCSVファイルに変換する処理」というコードが追加されることになる。つまり、2つのファイルにほぼ同じコードが存在するようになるわけだ。生成するグラフの種類を増やすために、さらにラッパースクリプトを作成することになれば、「TSVファイルをCSVファイルに変換する処理」はさらに多くのファイルに存在することになるだろう。

これは、メンテナンスをする上でとても面倒な状況を生むことになる。だとすれば、この処理は1カ所にまとめておいた方がよい。

現状を考えると、csv2chart.ps1に「TSVファイルをCSVファイルに変換する処理」を取り込めば、ラッパースクリプト側に似たようなコードが複数存在する状況を避けることはできる。そうなると「csv2chart.ps1」というスクリプト名が不適切になってくる。

これは、csv2chart.ps1というスクリプトをさらに汎用化させて「data2chart.ps1」というPowerShellスクリプトにすればスッキリする。

data2chart.ps1を作ってみる

この記事は
Members+会員の方のみ御覧いただけます

ログイン/無料会員登録

会員サービスの詳細はこちら