#author("2021-03-04T13:06:02+09:00","default:ryuichi","ryuichi")
#author("2021-03-04T13:06:12+09:00","default:ryuichi","ryuichi")
* ConvertFrom-Csv - CSVをパースする [#uf19177e]

** 前提 [#tcb9c562]

#shell(){{
> notepad.exe 1.csv
  ID,NAME,AGE
  1,太郎,15
  2,花子,13
  3,次郎,9
}}

- PowerShell5まではUTF-8 BOM付きで保存する
- それより新しいPowerShellならBOMなしでもよい
- 日本語を扱わないならどちらでもいい


** 基本 [#l3b10088]

#shell(){{
> gc .\1.csv | ConvertFrom-Csv
  ID NAME AGE
  -- ---- ---
  1  太郎 15
  2  花子 13
  3  次郎 9
}}


** デリミターを変更する [#s5bfee3d]

#shell(){{
> gc .\2.csv | ConvertFrom-Csv -Delimiter "`t"
  ID NAME AGE
  -- ---- ---
  1  太郎 15
  2  花子 13
  3  次郎 9
}}

- デリミターはデフォルトではカンマ(,)
- デリミタ―を2文字以上にしたい場合はConvertFrom-CsvではなくConvertFrom-Stringを使う

** ヘッダーを指定する [#r238189b]

#shell(){{
> 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 (?) で絞り込む [#mbbb5d76]

#shell(){{
> 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" }'''みたいにキャストして絞り込む

** 参考 [#h68f412a]
- ConvetFrom-Csv https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/convertfrom-csv?view=powershell-7.1
- ConvertFrom-Csv https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/convertfrom-csv?view=powershell-7.1
- 比較演算子 https://docs.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_comparison_operators?view=powershell-7.1

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS