PMPの流儀

我が家の流儀

我が家で気になったことを夫婦で取り上げていきます

MENU

PowerShell CSVファイルにアクセスする

PowerShellからCSVファイルを開いて内容にアクセスする方法を紹介します。以前はWindowsにはテキストのストリームを扱うツールがないため、awksed など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"
}

美しいですね

あ、ちなみにサンプルはうちの島にいる住民の一部です。