share facebook facebook2 twitter menu hatena pocket slack

2016.04.12 TUE

PowerShell 関連~PowerShell でテキストデータを CSV として読み込んでデータベースっぽく操作するメモ~

川原 洋平

WRITTEN BY川原 洋平

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 ってすごいと思った。

元記事はこちら

PowerShell 関連~PowerShell でテキストデータを CSV として読み込んでデータベースっぽく操作するメモ~