🍙

PowerShellでExcelのVLookUpっぽいことをしたい

2021/02/28に公開

やりたいこと

以下のようなファイルがあったとして、

sample2.csv
"foo",100,data1
"bar",200,data2
"hoge",300,data3

一列目に該当する行の2列目を表示したい。
例えばbarを検索対象としたらdata2を表示したい。

イメージ
> myVLookUP .\sample2.csv "bar" 2
data2

スクリプト例

myVLookUP.ps1
Function vlookup($filename, $pattern, $num)
{
    $A = Select-String -Pattern $pattern $filename
    $B = $A.toString().Split(",");
    $B[$num]
}

vlookup .\sample2.csv "bar" 2

実行結果は以下

> .\myVLookUp.ps1
data2

Functionについて

Functionの書き方はドキュメントに記載があります。

補足(Get-Member)

今回作成したスクリプトで関数内で$A, $Bを使用しています。

myVLookUP.ps1
Function vlookup($filename, $pattern, $num)
{
    $A = Select-String -Pattern $pattern $filename
    $B = $A.toString().Split(",");
    $B[$num]
}

vlookup .\sample2.csv "bar" 2

これらのメンバにどんなものがあるかは
Get-Member を使うとわかります。たとえば$Aのメンバを見てみると、
以下のように表示されます。

> $A = Select-String -Pattern "bar" .\sample2.csv
> $A | Get-Member


   TypeName: Microsoft.PowerShell.Commands.MatchInfo

Name         MemberType Definition
----         ---------- ----------
Equals       Method     bool Equals(System.Object obj)
GetHashCode  Method     int GetHashCode()
GetType      Method     type GetType()
RelativePath Method     string RelativePath(string directory)
ToString     Method     string ToString(), string ToString(string directory)
Context      Property   Microsoft.PowerShell.Commands.MatchInfoContext Context {get;set;}
Filename     Property   string Filename {get;}
IgnoreCase   Property   bool IgnoreCase {get;set;}
Line         Property   string Line {get;set;}
LineNumber   Property   int LineNumber {get;set;}
Matches      Property   System.Text.RegularExpressions.Match[] Matches {get;set;}
Path         Property   string Path {get;set;}
Pattern      Property   string Pattern {get;set;}

Discussion