プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
Windows PowerShell、テキストファイルの文字エンコーディングを変換する
結論から書けば

1.入力元ファイルと出力先ファイル(一時ファイル)を開く
2.入力元ファイルの内容を読み込んで出力先ファイル(一時ファイル)に書き込む
3.入力元ファイルを削除する
4.(一時ファイル)出力先ファイルのファイル名を入力元ファイル名にする

の手順でいけました。

それでは詳細を書いていきます。

文字エンコーディングがShift_JISのテキストファイルが大量にありましてね。
こいつらを全部UTF-8に変換したかったのです。

コマンドプロンプトだと文字エンコードの変換は大変そうだし、
がっつりコードを書いたりの大袈裟なことはやりたくなしな~ということで、
Windows PowerShellに目を付けました。
Windows PowerShellってバッチファイルのパワーアップ版みたいなものでしょ(--?

まず手を付けたのは、一つのファイルの文字エンコーディングを変換する方法です。
一つのファイルを変換できれば、勝ったようなものですよ。
あとはフォルダ内を探して、見つかったファイルを片っ端から変換するように
作りかえれば良いだけですからね。
大事なのは一つのファイルの変換部分です。

多分、できるべ(--?

と思いながら、あれこれやったところ、できました(*´ェ`*)
主処理部分のコードはこんなんですφ(--)

#-----------------------------------------------------
# パラメータ(入力元ファイル名)
#-----------------------------------------------------
param(
    [String]$input_file = "C:\test\input.txt"
)

    #一時ファイル名
    [String]$tmp_file = "C:\test\tmp.txt"

    #-------------------------------
    # 文字エンコーディング指定
    #-------------------------------
    # 入力元
    $encoding_from = [Text.Encoding]::GetEncoding("Shift-JIS")
    # 出力先
    $encoding_to = [Text.Encoding]::GetEncoding("UTF-8")

    #-----------------------------------------------------
    # ファイルストリームを開く
    #-----------------------------------------------------
    $sr = New-Object System.IO.StreamReader($input_file, $encoding_from)
    $sw = New-Object System.IO.StreamWriter($tmp_file, $false, $encoding_to)

    #-----------------------------------------------------
    # 入力元ファイルを読み込んで一時ファイルに書き込み
    #-----------------------------------------------------
    while (($line = $sr.ReadLine()) -ne $null){
        $sw.WriteLine($line)
    }

    #-------------------------------
    # ファイルストリームを閉じる
    #-------------------------------
    $sr.Close()
    $sw.Close()

    #-------------------------------------------------------------------
    # 入力元ファイルを削除して、一時ファイル名を入力ファイル名にする
    #-------------------------------------------------------------------
    Remove-Item $input_file -Force -Recurse
    Rename-Item $tmp_file -newName $input_file

やっていることは単純です。
元のファイルを読み込んで、別のファイルに出力しているだけ(--)b
出力先のファイルの文字エンコーディングとして
変換したい文字エンコーディングを指定してあります。
これで出力先のファイルが文字エンコーディング変換後のファイルになるので、
元ファイルを削除して、出力先のファイル名を元ファイルのファイル名にして完了です。

今回は元ファイルが無くなっても大丈夫な状況だったので遠慮なく削除していますが、
お仕事等で作る場合は、出力先のフォルダを変える形で、元ファイルも残しておくと思います。

入力元のフォルダと出力先のフォルダをパラメータとして受け取って、
入力元フォルダの全ファイルを変換して出力先フォルダに吐き出すような形が
無難じゃないですかね(--?
日を改めて、気が向いたらやってみます。

今日のところは、取りあえず、完了\(--)/
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:● Windows PowerShell  thema:システム開発 - genre:コンピュータ  Posted by ササキマコト 

  関連記事