PowerShell: SQL実行結果(TSV/CSV)をテキスト整形

概要

  • Azure Data Studio等のツールでSQLの実行結果を取得(コピー)するとタブ区切りの文字列になります。テキストベースの媒体にそのまま張り付けると、表示が崩れてしまうので、空白ベースに整形するツールを作成してみました。
  • Windows 10(64bit)+ PowerShell 5.1.19041の環境で動作確認しています。

スクリプトの仕様

機能概要

  • タブ区切りのファイルをテキストに整形するPowerShellのスクリプト(TabToText.ps1)です。スクリプトを修正することで、CSVファイルを整形することもできます。
  • 既定では、「単純整形」「表形式整形」の2つの整形方法を提供しますが、スクリプトの修正や追加でカスタマイズすることもできます。
    • 列の値の最大幅をその列の幅(列幅)にします。
    • 値の幅が最大幅(既定では32文字)を超える場合、”..”で省略して整形します。
  • 引数を指定して、入力・出力ファイルを指定することもできます。
    • 入力・出力ファイルのエンコーディングはUTF-8を使用します。
    • 既定では、カレントフォルダの”input.tsv”ファイルを読み込み、整形した結果を出力します。

使用方法

  1. スクリプトをgithubからダウンロードし、任意のフォルダに配置します。
    スクリプト名説明
    メインスクリプトTabToText.ps1メインのスクリプト
    単純整形用スクリプトTabToText_simple.ps1単純整形のための(ハンドラ)関数の定義
    表形式整形用スクリプトTabToText_table.ps1表形式整形のための(ハンドラ)関数の定義
    サンプル入力ファイルinput.tsvサンプルとなるTSVファイル
  2. PowerShellを起動し、TabToText.ps1を実行します。
    • 入力ファイルのパスを”-InFile”、整形結果の出力先ファイルのパスを”-OutFile”で指定します。
    • 入力ファイルの指定がない場合、カレントフォルダの”input.tsv”を読み込みます。
    • 出力先ファイルの指定がない場合、画面(標準出力)に整形結果を出力します。

    (私の場合、SQLの実行結果を都度整形したいので、input.tsvをエディタで開いたままにし、SQL等の実行結果をコピペして保存後にスクリプトを実行する整形、という使い方を想定しています。)

カスタマイズの参考

  • カンマ区切り(CSV)を整形したい場合、メインのTabToText.ps1の冒頭の変数($DELI)を”,”に変更します。
  • 整形方法を変更したい場合、メインスクリプトに読み込む整形用スクリプト(単純整形用スクリプト、または、表形式整形用スクリプト)を切り替えます。
  • 単純整形、または、表形式整形の動作を変更したい場合、それぞれのスクリプト(TabToText_simple.ps1, TabToText_table.ps1)のハンドラ関数を修正します。
  • 新しい整形方法を追加したい場合、新規のスクリプトファイルを作成して、そこに独自のハンドラ関数を実装することをお薦めします。
  • 想定しているハンドラ関数は次の通りです。
    ハンドラ関数名実行単位(回数)説明
    CalcColWidth入力の行・列(M x N)対象行・列の幅を返却します。(各列の幅を決定するための)
    ProcHeader整形開始前(1)

    整形開始前の出力内容を返却します。
    ProcRowBefore入力の行(M)整形結果を出力する前の出力内容を返却します。
    ProcRow入力行に対応する整形結果を返却します。
    ProcRowAfter整形結果を出力した後の出力内容を返却します。
    ProcFooter整形終了後(1)整形開始後の出力内容を返却します。
    • 入力の各行・各列毎にCalcColWidthを実行します。返却された値の最大値が各列の幅(列幅)になります。
    • 整形の開始前後でProcHeader, ProcFooterを実行します。整形が開始されると、各行毎にProcRowBefore, ProcRow, ProcRowAfterを順番に実行します。
    • ProcRowBefore, ProcRow, ProcRowAfterに引き渡される各列の値(配列)は、列幅までパディングされた値になっています。列幅を超えた値の終端は切り捨てられた状態(終端が”..”の省略記号)になっています。

ソースコード

  • 完全なソースコードはgithubで公開しています。
  • 説明の都合でソースコードにあるコメントは一部削除して掲載しています。

メインスクリプト

メインの処理を実装したスクリプトです。

  • 入力ファイルとしてCSVファイルを使用する場合、$DELIの値を”,”に変更してください。
  • 列幅を超える値の終端は切り捨て、省略記号”..”に置き換えます。切り捨て時に全角文字の有無によって、省略記号の数が変わる場合があります。
  • 整形方法(13-14行目)に関して、「単純」を使用する場合はTabToText_simple.ps1を有効化、「表形式」を使用する場合はTabToText_table.ps1を有効化してください。

単純整形用スクリプト

  • 各列の幅を整え、最大列幅($MAX_WIDTH)を超えた値は切り捨てます。
  • 1行目はカラム名、2行目以降は列値、のようなSQL実行結果(TSV)を想定しており、1行目直後にセパレータを挿入します。
  • ヘッダ名が異常に長いと無駄に列幅が広がる場合があります。$IGNORE_HEADERを有効すると、カラム名の幅を無視した列幅になります。

表形式整形用スクリプト

  • 動作は前述の単純整形用スクリプトと同様です。
  • 行・列の値に飾り付けするサンプルとして実装しました。