PowerShellでCSV形式のファイルや文字列を操作する方法

PowerShellでCSV形式のファイルや文字列を操作する方法

Windowsコマンドでは、CSV形式ファイルはテキストファイルとして扱われますが、Powershellでは、CSV形式のファイルや文字列を操作する専用コマンドレットが複数用意されています。

そこでここでは、Windows 10のPowershellでCSV形式のデータを操作するコマンドレットとその使用例を紹介します。

この記事は、以下の環境で実行した結果を基にしています。他のエディションやバージョンでは、動作結果が異なる場合があることをご了承ください。

ソフトウェアバージョン
Windows 10 Pro 64bit1809
PSVersion5.1.17763.134

オブジェクトをCSV形式の文字列に変換

入力されたオブジェクトをCSV形式の文字列に変換するには、ConvertTo-Csvコマンドレットを利用します。

使用例1

PS> Get-Process notepad | Select -Property Name,Id,WS | ConvertTo-Csv

#TYPE Selected.System.Diagnostics.Process
"Name","Id","WS"
"notepad","15588","18800640"

この例では、Get-Processコマンドレットでメモ帳のプロセス情報を取り出し、取り出されたオブジェクトから特定のプロパティ値を取り出し、それらをConvertTo-CSVコマンドレットでCSV形式の文字列に変換します。

出力される内容は、次のとおりです。

#TYPE Selected.System.Diagnostics.Process - 型情報を記述したコメント行です。

"Name","Id","WS" - 入力されたオブジェクトのプロパティ名がヘッダ行として出力されます。

"notepad","15588","18800640" - オブジェクトのプロパティを",(カンマ)"で区切った文字列が1行ずつ出力されます。

使用例2

PS> $Date = Get-Date | Select -Property DateTime,DayOfWeek
PS> ConvertTo-Csv -InputObject $Date -Delimiter ; -NoTypeInformation

"DateTime";"DayOfWeek"
"2018年12月8日 18:42:52";"Saturday"

この例では、まずGet-Dateコマンドレットで現在日時の情報を取り出し、取り出されたオブジェクトから特定のプロパティ値を取り出し、変数に格納します。

次に、変数に格納されているオブジェクトを入力オブジェクトとしてConvertTo-CSVコマンドレットでCSV形式の文字列に変換します。また、区切り文字(デリミタ)は";(セミコロン)"として、型情報を記述したコメント行は表示しないようにします。

CSV形式の文字列をオブジェクトに変換

CSV形式の文字列をカスタムオブジェクト(PSCustomObject)に変換するには、ConvertFrom-Csvコマンドレットを利用します。

使用例1

PS> $p = Get-Process notepad | Select -Property Name,Id,WS | ConvertTo-Csv
PS> $p | ConvertFrom-Csv

Name Id WS
---- -- --
notepad 15588 18849792

この例では、まずGet-Processコマンドレットでメモ帳のプロセス情報を取り出し、取り出されたオブジェクトから特定のプロパティ値を取り出し、それらをConvertTo-CSVコマンドレットでCSV形式の文字列に変換し、変数に格納します。

次に、変数に格納されているCSV形式の文字列を入力オブジェクトとしてConvertFrom-CSVコマンドレットでカスタムオブジェクトに変換します。

使用例2

PS> ConvertFrom-Csv @("月曜日,晴れ,0%","火曜日,曇り,30%","水曜日,雨,100%") -Header 曜日,天気,降水確率

曜日 天気 降水確率
---- ---- --------
月曜日 晴れ 0%
火曜日 曇り 30%
水曜日 雨 100%

この例では、CSV文字列を直接記述して、カスタムオブジェクトに変換します。

「-Header」オプションでは、ヘッダ文字列を指定しています。指定した列名はプロパティ名となります。

CSV形式ファイルに出力する

オブジェクトをCSV形式ファイルに出力するには、Export-Csvコマンドレットを利用します。

使用例1

PS> Get-Process notepad | select -Property Name,Id,WS | Export-Csv -Path processes.csv
PS> Get-Content .processes.csv

#TYPE Selected.System.Diagnostics.Process
"Name","Id","WS"
"notepad","15588","17358848"

この例では、Get-Processコマンドレットでメモ帳のプロセス情報を取り出し、取り出されたオブジェクトから特定のプロパティ値を取り出し、それらをExport-CSVコマンドレットでCSV形式ファイル「processes.csv」として出力します。

Get-Contentコマンドレットでは、出力したCSV形式ファイルの内容を表示しています。

使用例2

PS> Get-ChildItem E:test2 | select -Property FullName | Export-Csv -Path files.csv -Encoding Default -NoTypeInformation
PS> Get-Content .files.csv

"FullName"
"E:test2test.txt"
"E:test2テスト.txt"

この例では、Get-ChildItemコマンドレットで「E:test2」フォルダー内の内容を取り出し、取り出されたオブジェクトから特定のプロパティ値を取り出し、それらをExport-CSVコマンドレットでCSV形式ファイル「files.csv」として出力します。

また、出力されるCSV形式ファイルの文字コードは既定ではANSIとなり、日本語を含んでいると文字化けします。そのため「-Encoding」オプションを付加しています。また、型情報を記述したコメント行は表示しないようにします。

Get-Contentコマンドレットでは、出力したCSV形式ファイルの内容を表示しています。

CSV形式ファイルを読み込む

CSV形式ファイルを読み込み、その内容をカスタムオブジェクト(PSCustomObject)に変換するには、Import-Csvコマンドレットを利用します。

使用例1

PS> Get-Content .processes.csv

#TYPE Selected.System.Diagnostics.Process
"Name","Id","WS"
"notepad","876","18956288"

PS> Import-Csv -Path .processes.csv

Name Id WS
---- -- --
notepad 876 18956288

この例では、Get-Contentコマンドレットで、CSV形式ファイルの内容を確認後、Import-CsvコマンドレットでCSV形式ファイルを読み込んでいます。

なお、Import-CsvはCSVファイルの先頭行をヘッダーとして自動的にオブジェクトプロパティに設定してくれます。

使用例2

PS> Get-Process chrome | Export-Csv Processes.csv -Delimiter :
PS> $P = Import-Csv Processes.csv -Delimiter :
PS> $P | Format-Table

Name   SI Handles VM            WS        PM        NPM    Path                                                        Company     CPU
----   -- ------- --            --        --        ---    ----                                                        -------     ---
chrome 2  280     2203779563520 47755264  32063488  24472  C:Program Files (x86)GoogleChromeApplicationchrome.exe Google Inc. 0.734375
chrome 2  286     2203881271296 73924608  117809152 29504  C:Program Files (x86)GoogleChromeApplicationchrome.exe Google Inc. 12.296875
chrome 2  275     2203777978368 33140736  25948160  23656  C:Program Files (x86)GoogleChromeApplicationchrome.exe Google Inc. 2.78125
(省略)

この例では、まずGet-ProcessコマンドレットでWebブラウザ「Google Chrome」のプロセス情報を取り出し、それらをExport-CSVコマンドレットで区切り文字「:(コロン)」のCSV形式ファイルに出力します。

次に、出力したCSV形式ファイルを区切り文字「:(コロン)」でオブジェクトに変換し、そのオブジェクトを変数に格納し、変数をテーブル形式で表示しています。

あとがき

コマンドレットの書式やオプションを含め詳細に知りたい方は、英語であることを除けば、以下のMicrosoftサイトが参考になると思います。

Microsoft.PowerShell.Utility