📘
[PowerShell]Markdownのテーブル形式で各列の開始位置を合わせ整形するFunction
概要
Markdownのテーブル形式をソースコードで表示すると、列の開始位置がバラバラになっていることがあります。
視認性を向上するため、内容は変えずにインデントを揃えてフォーマットを整理するFunctionを作成。
この記事のコードはPowerShellスクリプトではなく、PowerShellウィンドウやターミナルなどの コンソール上での実行 を想定しています。
この記事のターゲット
- PowerShellユーザーの方
- Markdownテーブルのインデントを揃えてコードの視認性を上げたい方
環境
PowerShell 5.1
PowerShell 5.1
PS C:\WINDOWS\system32> $PSVersionTable
Name Value
---- -----
PSVersion 5.1.19041.4046
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.19041.4046
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
PS C:\WINDOWS\system32>
PowerShell 7(2025.06.10 追記)
PowerShell 7
PS C:\Users\XXXX> $PSVersionTable
Name Value
---- -----
PSVersion 7.5.1
PSEdition Core
GitCommitId 7.5.1
OS Microsoft Windows 10.0.19045
Platform Win32NT
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
WSManStackVersion 3.0
PS C:\Users\XXXX>
自作したコード
自作したFunction
# サブFunction
Function Test-UTF8Bom {
param (
[Parameter(Mandatory=$true)][System.String]$FilePath
)
# BOMのバイトシーケンス
$UTF8_BOM = [System.Byte[]](0xEF, 0xBB, 0xBF)
# バイトデータで読み込み
$fileBytes = [System.IO.File]::ReadAllBytes($FilePath)
# 先頭から3バイト分のデータでBOM付きか判定
if ($fileBytes[0..2] -join "," -eq $UTF8_BOM -join ",") {
return $true
} else {
return $false
}
}
# メインFunction
Function Format-MarkdownTableColumnWidth {
param (
[System.String]$FilePath
)
# 文字コードの判定
if (-not (Test-UTF8Bom $FilePath)) {
Write-Warning 'Not UTF8 BOM'
return $null
}
# マルチバイト文字を考慮して文字列のバイト数を計算する関数
Function Get-DisplayWidth {
param (
[string]$InputString
)
$width = 0
foreach ($char in $InputString.ToCharArray()) {
if ([System.Text.Encoding]::UTF8.GetByteCount($char) -gt 1) {
# マルチバイト文字の場合は2文字分としてカウント
$width += 2
} else {
# シングルバイト文字の場合は1文字分としてカウント
$width += 1
}
}
return $width
}
# ファイルから入力を読み込む
$MarkdownTable = (Get-Content -Path $FilePath -Raw)
# 入力を行ごとに分割
$lines = $MarkdownTable -split "`n"
# 各列の最大幅を計算
$maxWidths = @{}
foreach ($line in $lines) {
if (-not ([System.String]::IsNullOrWhiteSpace($line))) {
$columns = $line -split '\|'
for ($i = 1; $i -lt $columns.Length - 1; $i++) {
$column = $columns[$i].Trim()
$byteLength = (Get-DisplayWidth $column)
if (-not $maxWidths.ContainsKey($i)) {
$maxWidths[$i] = $byteLength
} else {
if ($byteLength -gt $maxWidths[$i]) {
$maxWidths[$i] = $byteLength
}
}
}
}
}
# 列の幅を揃えて再構築
$alignedTable = @()
foreach ($line in $lines) {
if (-not ([System.String]::IsNullOrWhiteSpace($line))) {
$columns = $line -split '\|'
$newLine = '|'
for ($i = 1; $i -lt $columns.Length - 1; $i++) {
$column = $columns[$i].Trim()
$padding = " " * ($maxWidths[$i] - (Get-DisplayWidth $column))
$newLine += " " + $column + $padding + ' |'
}
$alignedTable += $newLine
}
}
return $alignedTable -join "`r`n"
}
対応方法
-
PowerShellウィンドウ、もしくはターミナル経由でコンソールを起動
-
自作したコードをコンソール画面にコピペ
-
入出力ファイルの場所を定義
入出力ファイルを定義# 入力ファイルのパスを指定 $inputFilePath = "D:\Downloads\input_markdowntable.md" $outputFilePath = "D:\Downloads\output_markdowntable.md" -
入力ファイルを作成し指定の場所に保存
それぞれインデントがズレている状態を作成
入力ファイル「input_markdowntable.md」| column-A | column-B | column-C | | --- | --- | --- | | value-A1 | B1 | C1 | | A2 | column-B2 | C2 | | A3 | B3 | column-C3 | -
自作のコード(Function)を呼び出しリダイレクトでファイル出力
自作Functionの呼び出し# 関数を呼び出して結果をファイルに出力 Format-MarkdownTableColumnWidth $inputFilePath > $outputFilePath -
あらかじめ設定した出力先を確認しインデントが合っていることを確認
出力ファイル「output_markdowntable.md」| column-A | column-B | column-C | | --- | --- | --- | | value-A1 | B1 | C1 | | A2 | column-B2 | C2 | | A3 | B3 | column-C3 |
まとめ
手作業でやっていたことをコード化。長期運用していないので入力ファイルのケースにより、
不具合があるかもしれません。
参考文献
なし
関連記事
Discussion