PowerShellでCSVを読み取るときの注意点は2つです。
(ハマってしまいました)
先に結論。
・PowerShellのCSV読み取りは、「Get-Content sample.csv | ConvertFrom-Csv」を用いる。
・CSVのヘッダー情報はCSVファイル1行目に書くか、ConvertFrom-Csvの-Headerで指定する。
以下、詳細です。
PowerShellでは、
Import-Csv sample.csv
というふうにImport-Csvコマンドレットを使うだけでCSVファイルを読み取ることができます。いや違った。読み取ることができるように見えます。
しかし、2つのトラップがあります。
1.CSVファイルのヘッダー
プログラミングをしていて、以下のようなエラーに悩まされました。
PS C:\Users\USER> Import-Csv sample.csv
Import-Csv : 引数 “name” の値が無効なため、引数を処理できません。引数 “name” の値を変更し、操作を実行し直してください。
よくわからないエラーですよね。調べたところ、Import-Csvは-Headerオプションをつけないと、CSVファイルの1行目をヘッダーとして理解するということがわかりました。sample.csvは以下のようなファイルだったのです。
1000,
2000,あいう
3000,
4000,えお
PowerShellは1行目をヘッダーとして理解しますが、ヌル値があります。ヌルはヘッダー情報としては無効となるので、エラーになってしまうのです。
Import-Csv sample.csv -Header “ID”,”Name”
というようにヘッダーを指定する。あるいは、
ID,Name
1000,
2000,あいう
3000,
4000,えお
というようにCSVファイル1行目にヘッダーを書けばOKです。
2.文字コード
CSVを表示させようとして、
Import-Csv sample.csv -Header “ID”,”Name”
として実行すると、文字化けします。
ID Name
– —-
1000
2000 ������
3000
4000 ����
Unicodeにしなければならないそうです。しかし、Import-Csvには-Encodingが無い(おいおい)。そこで、
Get-Content sample.csv > sample2.csv
とするとsample2.csvはUnicodeになるので、これを読み取って処理していたのですが、うーん微妙。
調べたところ、Get-Contentを使うべきらしい。
Get-Content sample.csv | ConvertFrom-Csv -Header “ID”,”Name”
ID Name
– —-
1000
2000 あいう
3000
4000 えお
ふむふむ。これでいいね。
おまけ。1のCSVファイルのヘッダーについてですが、ConvertFrom-Csvは動きが異なります。エラーにならず、ヌルがある列がデータとして認識されなくなります。
Get-Content sample.csv | ConvertFrom-Csv
1000
—-
2000
3000
4000
となります。1行目の「1000,」がヘッダーとして認識され、ヘッダーのうちの「1000」の列のみが読み込まれます。
わかりにくいなー。
PowerShellのわかりにくさは今に始まったことではないけど。