
PowerShellを使ってExcelできちんと開けるCSVファイルを作成する方法
PowerShellからCSVファイルを作成し、それをExcelで開いて…という操作は結構需要があり、頻繁に行われるのではないかと思います。ちょっとしたはまりポイントがありますので、そのあたりのTipsを紹介しようと思います。
Export-Csv
PowerShellの素敵な点の1つはオブジェクトを簡単にCSVに出力できるコマンドレットが標準で用意されているところだと思います。
ただし、日本語が含まれている場合に、そのまま何も考えずにExport-Csvを実行すると文字化けが発生してしまいます。
これは、Excelで読み込むときにエンコーディングの判定に失敗して文字化けしている…という事ではなく、PowerShellでファイルを吐き出した時に????に変換されてしまっています。なので、出力時にきちんとエンコーディングを指定してあげる必要があります。
どのエンコーディングを使うか、というのは人によって意見が違うかもしれませんが、私はいつもUTF-8を使います。これであればきちんと日本語も出力され、Excelで開いた時にも文字化けもなく意図した通りに開きます。
ExcelでShift-JIS以外の文字コードでは文字化けが発生する問題
実は先ほどの例ではうまくいっていますが、ExcelはCSVファイルはShift-JISにしておかないと文字化けすることが多い困ったやつです。回避策はいくつかあります。以下のあたりが参考になります。
ExcelでUTF-8のCSVを開く方法 (CodeZine編集部ブログ)
ExcelでUTF-8エンコーディングされたCSVファイルを開く方法 – 大人になったら肺呼吸
先ほどの例ではBOM付きのUTF-8であったためうまく表示されたわけです。Stirlingでファイルを確認するとファイルの先頭に「EFBBBF」が不可されていることがわかります。
スクリプト内でファイルに出力する場合
Export-Csvを使う場合には-Encodingオプションを付ければよいことはわかりましたが、foreachの中などで、自分で文字列をファイルに出力したいようなときには残念ながら別の問題が発生します。
このようにA列にすべて表示されてしまいます。(※文字化けをしていないのはExcel2010だからなのではないかと思います。)
これも回避策としてはいくつかあると思いますがShift-JISで出力するにはAdd-Contentコマンドレットで-EncodingにStringを指定することができます。
UTF-8でBOM付きにしようと思ったら、先にファイルを作成しておくと良いようです。
コメント