2019年2月24日日曜日

PowerShellで、簡単な記述でファイル変換のコード変換をしたい

今回の記事では、PowerShellでもって、ファイルのコード変換を簡単にやってみようというものです。

PowerShellは、シェルスクリプトと言いつつ.NET Frameworkが使えるために完全にプログラミング言語の性質も持っています。

その気になれば、C#言語やJavaScriptの勢いで突き進む事も可能ですが、シェルスクリプトの気軽さも併せもっているのが本当に驚異。

今回は、たとえば、BOMなしUTF-8のファイルを、WindowsおなじみのShift_JISに簡単な記述で変換してみます。




$CONVF1="C:\TEMP\SAMPLE_UTF8N.DAT"
$CONVF2="C:\TEMP\SAMPLE_SJIS.DAT"

$ENC1=NEW-OBJECT System.Text.UTF8Encoding -ArgumentList @($false)
$ENC2=[System.Text.Encoding]::GetEncoding("Shift_JIS")

$DATA1=[System.IO.File]::ReadAllLines($CONVF1,$ENC1)
[System.IO.File]::WriteAllLines($CONVF2,$DATA1,$ENC2)

↑たったこれだけで(も)OKです。

変数名や文字コードオブジェクトの名前は、分かりやすいように末尾1が変換前、末尾2が変換後としました。

バイトストリームクラスを使って1行づつ読んで書く・・・というのも可能ですが、単純な変換であれば、変換元のコードで一気にファイル内容を配列に読んで、変換先のコードで配列をファイルに一気に書き込む・・・でOKです。

ちなみに、BOMなしUTF-8のエンコードをしたい時は、System.Text.EncodeクラスのスタティックメソッドGetEncodingではだめなので注意が必要です(BOM付きになってしまう)。


↑変換前は、BOMなしUTF-8です。


↑変換後は、Shift_JISに変換されました。

文字コードを入れ替えるだけで、他のパターンでもコード変換が簡単に出来るようになります。