前回までで、棒グラフと円グラフを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スクリプトにすればスッキリする。