PowerShellのOut-GridViewの列名重複を回避する
はじめに
Windows PowerShellには、Out-GridView
というコマンドがあります。
これは、行と列を持つ内容をGUIで表示できる機能で、 Import-Csv
コマンドと組み合わせて、CSVファイルのデータを手軽にGUIで閲覧することができます。
Import-Csv [csvファイル] -Encoding [エンコード] | Out-GridView
しかし、Import-Csv
する際に、列名の重複は許されません。
同名の列名がある場合、Out-GridView
するところまでたどり着かずエラーとなってしまいます。1
とりあえずCSVを閲覧するのに便利なのが、Out-GridView
コマンドです。 そこで、エラー時に連番をヘッダーにして開き直すスクリプトを作成しました。
環境
Windows 10 Home 64bit
Windows PowerShell 5.1.19041.906
※
Out-GridView
でWindowsのGUIを使用するため、マルチプラットフォーム版のPowerShell 7などでは動きません。
エラー時に列名を自動付与するPowerShellスクリプト
#$args = ドラッグ&ドロップされた要素 #拡張子の指定(大文字小文字の区別なし。.を含む) $extension = ".csv" #エンコードの指定(Default(Shift_JIS)、またはUTF8(UTF-8)) $encoding = "Default" #ドラッグ&ドロップされた要素を1つずつ取り出して処理 foreach ($arg in $args) { #指定の拡張子の場合のみ処理 if ((Get-Item $arg).Extension -eq $extension) { try { Import-Csv $arg -Encoding $encoding | Out-GridView } #エラー時の処理 catch { #1行目の内容の個数を取得 $col_count = (((Get-Content $arg -Encoding $encoding)[1]).Split(",").Count) #取得した個数分の列名をつけて表示 Import-Csv $arg -Encoding $encoding -Header @(1..$col_count) | Out-GridView } } } exit
何らかのエラーが発生したとき、 CSVの2行目[添字1]の内容から項目数(列数)を取得して、その連番をヘッダーに指定します。
やっつけ処理なので、ちゃんとやるなら全行の項目数を確認して最大値を取得する必要がありそうです。 今回はCSVであることが前提なので実装していません。
もし、列名重複エラーのみをcatchしたい場合は、catchの最初を以下のように変更します。
catch [System.Management.Automation.ExtendedTypeSystemException] {
今回掲載しているのは、ファイルをドラッグアンドドロップすることで動くスクリプトです。 スクリプトをps1ファイルとして保存したあと、ショートカットを作成して、 引数(プロパティ > リンク先)を修正すると、使用することができます。
powershell -ExecutionPolicy RemoteSigned -File [ps1ファイルパス]
上記PowerShellのドラッグアンドドロップについては、以下を参考にさせていただきました。
おわりに
最新バージョンのExcelでない場合、CSVファイルがUTF-8だと文字化けしてしまうのは、あるある話ですが、Out-GridView
でエンコードをUTF8にすることで、手軽に文字化けなく閲覧することができます。
とにかくファイルの中身を列を揃えて閲覧したいという場合に有効な手段の1つになると思います。 (ただし大量データだとものすごく重い、かつ列数は256までの模様)
感想など
Out-GridView
自体はCSVでなくても開けるので、いろいろと使い道がありそう。- 表示したGUIを閉じる機能があれば知りたい(制御したい)。
- GUIまで使えてしまうPowerShellの魅力にどんどん惹かれてます。 今後もちょこちょこPowerShell記事を書くかもです。 ただあんまり依存するとシステム的にIEやめられない問題みたいになってしまいそうで怖い。
-
(2021/05/29 追記)列名重複エラーについて、当初「
Out-GridView
で表示する場合において、列名の重複は許されません。」と記載していましたが、再度調べたところImport-Csv
する時点でエラーとなっていました。そのため、Out-GridView
コマンドの有無に関わらずImport-Csv
コマンドを使用する際に、列名に重複があるとエラーになります。該当部分の記載内容を修正しました。↩