tl;dr
PowerShell でテキストデータを CSV っぽく構造化してデータベースっぽく操作するメモ。ホントにもメモ。
メモ
参考
WindowsPowerShellでCSVをDBっぽく扱う
CSVファイルに対して、特定カラムを抽出したり、条件で抽出したりしたいとき、 Excelでオートフィルタ掛ける…
www.twinfami.com
有難うございます!
PowerShell の確認
PS C:sample-powershellcsv> $PSVersionTable
Name Value
---- -----
PSVersion 5.0.10586.63
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.10586.63
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
元となるテキストデータ
納豆 100 お餅 100 馬肉 1000 鮭 1000 シイタケ 2000
上記のような一列目と二列目が半角スペースで区切られたテキストファイルを用意。ちなみに自分の好きな食べ物。
CSV 化
ConvertFrom-CSV コマンドレットを利用する。
Get-Content sample.txt | ConvertFrom-CSV -header 品名, 価格 -Delimiter " "
以下、実行例。
PS C:sample-powershellcsv> Get-Content sample.txt | ConvertFrom-CSV -header 品名, 価格 -Delimiter " " 品名 価格 ---- ---- 納豆 100 お餅 100 馬肉 1000 鮭 1000 シイタケ 2000
変数に放り込む場合には以下のように。
PS C:sample-powershellcsv> $CSV = Get-Content sample.txt | ConvertFrom-CSV -header 品名, 価格 -Delimiter " "
上記のように勝手にテーブル構造にしてくれる。
各要素には以下のようにアクセスする。
PS C:sample-powershellcsv> $CSV[1].品名 お餅
DB っぽく
Where-Object を利用して検索してみる。
PS C:sample-powershellcsv> $CSV | Where-Object {$_.品名 -eq '馬肉'}
品名 価格
---- ----
馬肉 1000
0 行目から 2 行目(1 行目から 3 行目)を出力する。
PS C:sample-powershellcsv> $CSV[1..2] 品名 価格 ---- ---- 納豆 100 お餅 100 馬肉 1000
価格列のみ出力する。
PS C:sample-powershellcsv> $CSV.価格 100 100 1000 1000 2000
価格列の合計を計算する。
PS C:sample-powershellcsv> @($CSV.価格) | ForEach-Object{$TOTAL += [int]$_}
PS C:sample-powershellcsv> Write-Output $TOTAL
4200
ちょっと行を追加して複数条件で絞り込んでみたりする。
納豆 100 納豆 200 お餅 100 馬肉 1000 鮭 1000 シイタケ 2000
高級納豆を追加して、150 円以上の納豆のみ出力させてみる。
PS C:sample-powershellcsv> $CSV = Get-Content sample.txt | ConvertFrom-CSV -header 品名, 価格 -Delimiter " "
PS C:sample-powershellcsv> $($CSV | Where-Object {$_.品名 -eq '納豆'}) | Where-Object {$_.価格 -gt 150}
品名 価格
---- ----
納豆 200
おお、一パック 200 円の納豆は高価である。
馬肉の値段が高騰したので値段を変更してみる。
#
# 馬肉の価格を確認
#
PS C:sample-powershellcsv> $($CSV | Where-Object {$_.品名 -eq '馬肉'})
品名 価格
---- ----
馬肉 1500
#
# 2500 円に更新
#
PS C:sample-powershellcsv> $($CSV | Where-Object {$_.品名 -eq '馬肉'}) | Where-Object {$_.価格 = 2500}
PS C:sample-powershellcsv> $($CSV | Where-Object {$_.品名 -eq '馬肉'})
品名 価格
---- ----
馬肉 2500
#
# 価格の更新は以下のようにも書ける
#
PS C:sample-powershellcsv> $($CSV | Where-Object {$_.品名 -eq '馬肉'}).価格 = 10000
PS C:sample-powershellcsv> $($CSV | Where-Object {$_.品名 -eq '馬肉'})
品名 価格
---- ----
馬肉 10000
10000 円もかなり高額である。
以上
PowerShell ってすごいと思った。