tl;dr
PowerShell でテキストデータを CSV っぽく構造化してデータベースっぽく操作するメモ。ホントにもメモ。
メモ
参考
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 ってすごいと思った。
元記事はこちら
「PowerShell 関連~PowerShell でテキストデータを CSV として読み込んでデータベースっぽく操作するメモ~」