課題
UTF-8を前提としたツール
Power Automate において、テキストファイルの読み書きはUTF-8で行われるようだ
そのため、それ以外の符号化方式で保存されたファイルを読み込むと文字化けしてしまう
ファイルのコピーのように文字列操作を必要としない場合においては、デコードせずにそのまま書き込めば文字化けを回避できることが以前から知られている1
一方で、文字化けさせずに読み込んで文字列を操作する方法は、私の知る限り現在まで見つかっていない
しかし Power Automate のユーザ層や用途を勘案すると、UTF-8以外にも、Shift_JISで保存されたCSVなどのテキストファイルを読み込んで、クラウドフロー上で文字列を操作したい状況はままあるのではないだろうか?
そしてShift_JISを扱えないがために、部分的な手作業が発生して完全自動化のネックになっていたり、一部の処理を別のツールで実行せざるを得ず、運用・保守が煩雑になっていたりするかもしれない
そういった状況の改善を願い、解決策をここに共有する
文字化けの例
- ファイル:Shift_JISで保存したCSVを指定
- コンテンツ タイプの推測:
はい
を選択(=デフォルト)
解決方法
手順
①推測を無効にしてファイルを取得
- ファイル:Shift_JISで保存したCSVを指定
- コンテンツ タイプの推測:
いいえ
を選択
②ボディを書き換えて型変換
手順①のボディ(オブジェクト)のコンテンツタイプを正しいMIMEタイプに書き換える
それを文字列へ変換すれば、コンテンツタイプを基にデコード処理が実行される
実際にその処理を行うには、適当なアクションに次のような式を挿入すればよい
string(
setProperty(
body('Get_file_content'),
'$content-type',
'text/csv; charset=shift_jis'
)
)
正しく読み込めているようで、以下のように文字列操作も問題なく行える
例)改行コードで分割
split(
outputs('Load_csv'),
decodeUriComponent('%0D%0A')
)
補足:Shift_JISだけではない
タイトルやサンプルデータにはShift_JISで保存されたCSVを用いているが、それに限らず、別の符号化方式やフォーマットでも使える
手順②のMIMEタイプの記述を変更すれば、各種テキストファイルに対応可能
例)
'text/plain; charset=shift_jis'
'text/plain; charset=euc-jp'
-
'application/json; charset=shift_jis'
2
注意:未検証事項
もしかすると、Shift_JISとCP932の違いで一部文字化けが発生するかもしれない3
- 名簿とかありえるかも(髙橋さんや山﨑さん)
- 丸数字(①②③)もそこそこ使われる?
余談
うまくいかなかった話
少しだけ試行・検討の過程も記しておく
符号化方式を指定してデコード
まずはファイル取得系のアクションにおける自動変換(コンテンツタイプの推測)を止めて、手動で変換できないかと考えた
しかし次に示すように、デコード関数のパラメータはひとつのみで、符号化方式を指定することはできない(=UTF-8として処理される)
base64ToString('<value>')
Parameter Required Type Description <value> Yes String The base64-encoded string to decode
(引用元:Reference guide for expression functions - Azure Logic Apps | Microsoft Learn)
そこで、リファレンスの変換関数一覧をぼんやり眺めながら、符号化方式を指定してデコードできそうなアプローチを考えた
データURLに変形してデコード
ファイルコンテンツをデータURLの形式に整えてからデコードする方法を思いついたので試してみた
dataUriToString(
concat(
'data:text/csv;charset=shift_jis;base64,',
body('Get_file_content')?['$content']
)
)
しかし、Shift_JISはサポート対象外である旨のエラーメッセージが返された
InvalidTemplate.(中略)The template language function 'dataUriToString' parameter is not valid. The provided charset 'shift_jis' is not supported.
没タイトル供養
初投稿なのでタイトルに悩み、キャッチーさと適用対象の一般化を両立させようとした結果、長くなり過ぎたので没にした(この葛藤が伝わる読者がいらっしゃったら嬉しい)
+++
【Power Automate Tips】Shift_JISで保存されたCSV(UTF-8以外で保存されたテキストファイル)を文字化けさせずに読み込む方法
+++
しかし、削った部分(=カッコ内)は解決方法の補足に落とし込めたため、結果的には最適なかたちに落ち着いたのではないかと思っている
-
Power Automate でテキストファイルの文字化けを回避する | Japan Dynamics CRM & Power Platform Support Blog ↩
-
キャスト関数も変更する必要がある:
string(setProperty(...))
→json(setProperty(...))
(そのままだとJSON文字列に変換されてしまう) ↩ -
投稿直前にふと思って書き足したため未検証(
charset
には何て書けばいいんだろう?) ↩