Select-Object
が使えない、とあることからImport-Csv
を試した上で上手くいかなかった、想定して話をします。
1. Excelに頼る
- Excelがインストールされている
- CSVファイルがExcelが解釈できる形式
であるなら、ExcelのCOM操作でやる手があります(PowerShellでやる意味が薄いですが)。
以下はVBAの場合のサンプルです。
ExcelのCOM操作は共通なので、VBAの構文をPowerShellで置き換えれば、PowerShellで動きます。
vba
1Dim csvPath As String
2csvPath = "C:\Example.csv"
3
4'csvファイルをExcelのファイルとして開く
5Dim csvBook As Excel.Workbook
6Set csvBook = Excel.Application.Workbooks.Open(csvPath)
7
8'シート取得(CSVなら Worksheet 1枚しか無いはず)
9Dim ws As Excel.Worksheet
10Set ws = csvBook.Worksheets.Item(1)
11
12'`Worksheet.UsedRange.Value()`で
13'値の入っているセル範囲の値を二次元配列を取得してforeach
14Dim v As Variant
15For Each v In ws.UsedRange.Value()
16 '条件判定・出力
17 If v Like "C:*" Then
18 Debug.Print v
19 End If
20Next v
21
22'保存せずに閉じる
23Call csvBook.Close(False)
2. リフレクションで全プロパティを参照する
PowerShellは動的な操作にも強く、以下のように参照するプロパティを動的に指定することができます。
[string]$propName = "Length"
@().$propName # => Array.Length => 0
また、Import-Csv
コマンドレットで生成されるオブジェクトはPSObjectを拡張しているため、NoteProperty
のメンバーを列挙すればCSVの列名がわかります。
$csvData = Import-Csv -Path $csvPath
$csvData[0] | Get-Member -MemberType NoteProperty
これらを組み合わせれば全列参照できるかと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。