ConvertFrom-Csv - CSVをパースする
前提
> notepad.exe 1.csv
ID,NAME,AGE
1,太郎,15
2,花子,13
3,次郎,9
- PowerShell5まではUTF-8 BOM付きで保存する
- それより新しいPowerShellならBOMなしでもよい
- 日本語を扱わないならどちらでもいい
基本
> gc .\1.csv | ConvertFrom-Csv
ID NAME AGE
-- ---- ---
1 太郎 15
2 花子 13
3 次郎 9
デリミターを変更する
> gc .\2.csv | ConvertFrom-Csv -Delimiter "`t"
ID NAME AGE
-- ---- ---
1 太郎 15
2 花子 13
3 次郎 9
- デリミターはデフォルトではカンマ(,)
- デリミタ―を2文字以上にしたい場合はConvertFrom-CsvではなくConvertFrom-Stringを使う
ヘッダーを指定する
> gc .\1.csv | select -Skip 1 | ConvertFrom-Csv -Header "ID","Namae","Nenrei"
ID Namae Nenrei
-- ----- ------
1 太郎 15
2 花子 13
3 次郎 10
> gc .\1.csv | select -Skip 1 | ConvertFrom-Csv -Header (1..3)
1 2 3
- - -
1 太郎 15
2 花子 13
3 次郎 9
- ヘッダーを指定する場合、select -Skip 1でCSVファイルのヘッダー行を捨てる(ヘッダ-行がある場合)
- 文字列で指定するのが面倒な場合は(1..3)のように数値リストで指定してもよい
Where-Object (?) で絞り込む
> gc .\1.csv | ConvertFrom-Csv | ? { $_.ID -eq "1" }
ID NAME AGE
-- ---- ---
1 太郎 15
> gc .\1.csv | ConvertFrom-Csv | ? { [int] $_.AGE -gt 10 }
ID NAME AGE
-- ---- ---
1 太郎 15
2 花子 13
- 数値で比較する場合は[int]でキャストする
- ちなみに日付カラムがあるなら、? { [datetime] $_.DATE -gt "2021/01/01" }みたいにキャストして絞り込む
参考