PowerShellからCSVファイルを開いて内容にアクセスする方法を紹介します。以前はWindowsにはテキストのストリームを扱うツールがないため、awk やsed などUnix系のコマンドを使っていましたが、PowerShellでも簡単にアクセスができます。
CSVファイル
まずはテスト用のCSVファイルを用意します。1行目はヘッダです。
test.csv
種別,名前,口癖 イヌ, キャラメル, ワン リス, ジュン, あながち アリクイ, マコト, ホントに コグマ, ジャスミン, チャ
単純出力
PowerShell には Import-Csv というCSVを簡単に取り扱うためのコマンドが用意されています。単純にファイル名を指定すると、内容が出力されます。
Import-Csv 'test.csv'
実行結果
種別 名前 口癖 -- -- -- イヌ キャラメル ワン リス ジュン あながち アリクイ マコト ホントに コグマ ジャスミン チャ
データへのアクセス (1)
次に内容を取り出してみましょう。リスじゃなければ名前・種別・口癖を成型して出力してみます。
foreach文で1行ずつ$x変数に格納します。そして後ろにカラム名をつけると取り出せます。カラム名が漢字なら、漢字を変数としてアクセスできます。
CSVをオブジェクト風に触れるのは、ちょいと感動モノです。
$line = Import-Csv 'test.csv' foreach($x in $line) { if($x.種別 -ne 'リス') { $n = $x.名前 $t = $x.種別 $k = $x.口癖 Write-Host "名前 = $n, 種別 = $t, 口癖 = $k" } }
実行結果
名前 = キャラメル, 種別 = イヌ, 口癖 = ワン 名前 = マコト, 種別 = アリクイ, 口癖 = ホントに 名前 = ジャスミン, 種別 = コグマ, 口癖 = チャ
いい感じですね。
しかし記述の仕方がC#風で、PowerShellのスクリプトとしてはちょっとイケてません。
データへのアクセス (2)
PowerShellのセオリーに従ってパイプを活用してみると・・・
・test.csv を Import-Csvに流し込みます。
・フィルターで条件を絞り込みます(Where-Object)
・個別の処理を行います(ForEach)
'test.csv' | Import-Csv | Where-Object { $_.種別 -ne 'リス' } | ForEach-Object { $n = $_.名前 $t = $_.種別 $k = $_.口癖 Write-Host "名前 = $n, 種別 = $t, 口癖 = $k" }
データへのアクセス (3)
さらに、Where-Object は ?、ForEach-Object は % に省略できるので、最終形は以下になります。
'test.csv' | Import-Csv | ? { $_.種別 -ne 'リス' } | % { $n = $_.名前 $t = $_.種別 $k = $_.口癖 Write-Host "名前 = $n, 種別 = $t, 口癖 = $k" }
美しいですね
あ、ちなみにサンプルはうちの島にいる住民の一部です。