【Power Automate Tips】Shift_JISで保存されたCSVを文字化けさせずに読み込む方法

## 課題
### UTF-8を前提としたツール
Power Automate において、テキストファイルの読み書きはUTF-8で行われるようだ
そのため、それ以外の符号化方式で保存されたファイルを読み込むと文字化けしてしまう

ファイルのコピーのように文字列操作を必要としない場合においては、デコードせずにそのまま書き込めば文字化けを回避できることが以前から知られている[^1]
一方で、文字化けさせずに読み込んで文字列を操作する方法は、私の知る限り現在まで見つかっていない

しかし Power Automate のユーザ層や用途を勘案すると、UTF-8以外にも、Shift_JISで保存されたCSVなどのテキストファイルを読み込んで、クラウドフロー上で文字列を操作したい状況はままあるのではないだろうか？

そしてShift_JISを扱えないがために、部分的な手作業が発生して完全自動化のネックになっていたり、一部の処理を別のツールで実行せざるを得ず、運用・保守が煩雑になっていたりするかもしれない

そういった状況の改善を願い、解決策をここに共有する

[^1]: [Power Automate でテキストファイルの文字化けを回避する | Japan Dynamics CRM & Power Platform Support Blog](https://jpdynamicscrm.github.io/blog/powerautomate/Avoid-Character-Corruption-Methods/#②-文字コードが-ANSI-Shift-JIS-であるテキストファイルを-Power-Automate-で文字化けを起こさずに扱う方法 "② 文字コードが ANSI (Shift_JIS) であるテキストファイルを Power Automate で文字化けを起こさずに扱う方法")

### 文字化けの例
- ファイル：Shift_JISで保存したCSVを指定
- コンテンツ タイプの推測：`はい`を選択（＝デフォルト）

![設定画面のスクショ：前述の条件が設定されている](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4090078/5979554e-b95b-484b-af61-669328654780.png)

実行結果
![実行結果のスクショ：文字化けしたCSVが表示されている](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4090078/e6fd45b5-99ae-4f8c-a473-01e8219c2959.png)

## 解決方法
### 手順
#### ①推測を無効にしてファイルを取得
- ファイル：Shift_JISで保存したCSVを指定
- コンテンツ タイプの推測：`いいえ`を選択

![設定画面のスクショ：前述の条件が設定されている](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4090078/8bc64871-770f-4555-ae80-eef9f819db44.png)

実行結果
![実行結果のスクショ：デコード前のファイルコンテンツ（メタデータとしてコンテンツタイプを含むオブジェクト）が表示されている](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4090078/193c4ad7-52ae-45c3-bf45-d007a4670779.png)

#### ②ボディを書き換えて型変換
手順①のボディ（オブジェクト）のコンテンツタイプを正しいMIMEタイプに書き換える

![補足を書き込んだスクショ：後述の式による書き換え内容が図示されている](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4090078/c5a674d4-4cd3-450e-8511-bc1928d7ca46.png)

それを文字列へ変換すれば、コンテンツタイプを基にデコード処理が実行される

実際にその処理を行うには、適当なアクションに次のような式を挿入すればよい
```
string(
  setProperty(
    body('Get_file_content'),
    '$content-type',
    'text/csv; charset=shift_jis'
  )
)
```
作成アクションでの実行結果
![実行結果のスクショ：正しくデコードされたCSVが表示されている](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4090078/bc7f093e-e2d3-4751-8a46-e8d7c13821c1.png)

正しく読み込めているようで、以下のように文字列操作も問題なく行える

例）改行コードで分割
```
split(
  outputs('Load_csv'),
  decodeUriComponent('%0D%0A')
)
```
作成アクションでの実行結果
![実行結果のスクショ：改行で分割された文字列の配列が表示されている](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4090078/4166b354-adf3-4c0d-919e-2f346398de04.png)

### 補足：Shift_JISだけではない
タイトルやサンプルデータにはShift_JISで保存されたCSVを用いているが、それに限らず、別の符号化方式やフォーマットでも使える

:::note info
手順②のMIMEタイプの記述を変更すれば、各種テキストファイルに対応可能
:::

例）
- `'text/plain; charset=shift_jis'`
- `'text/plain; charset=euc-jp'`
- `'application/json; charset=shift_jis'`[^2]

[^2]: キャスト関数も変更する必要がある：`string(setProperty(...))` → `json(setProperty(...))`
（そのままだとJSON文字列に変換されてしまう）

### 注意：未検証事項
もしかすると、Shift_JISとCP932の違いで一部文字化けが発生するかもしれない[^3]
- 名簿とかありえるかも（髙橋さんや山﨑さん）
- 丸数字（①②③）もそこそこ使われる？

[^3]: 投稿直前にふと思って書き足したため未検証（`charset`には何て書けばいいんだろう？）

## 余談
### うまくいかなかった話
少しだけ試行・検討の過程も記しておく

#### 符号化方式を指定してデコード
まずはファイル取得系のアクションにおける自動変換（コンテンツタイプの推測）を止めて、手動で変換できないかと考えた

しかし次に示すように、デコード関数のパラメータはひとつのみで、符号化方式を指定することはできない（＝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](https://learn.microsoft.com/en-us/azure/logic-apps/workflow-definition-language-functions-reference#base64tostring "base64tostring")）

そこで、[リファレンスの変換関数一覧](https://learn.microsoft.com/en-us/azure/logic-apps/workflow-definition-language-functions-reference#conversion-functions "Conversion functions")をぼんやり眺めながら、符号化方式を指定してデコードできそうなアプローチを考えた

#### データURLに変形してデコード
ファイルコンテンツをデータURLの形式に整えてからデコードする方法を思いついたので試してみた
```
dataUriToString(
  concat(
    'data:text/csv;charset=shift_jis;base64,',
    body('Get_file_content')?['$content']
  )
)
```
しかし、Shift_JISはサポート対象外である旨のエラーメッセージが返された
> :::note warn
> **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以外で保存されたテキストファイル）を文字化けさせずに読み込む方法
＋＋＋

しかし、削った部分（＝カッコ内）は解決方法の補足に落とし込めたため、結果的には最適なかたちに落ち着いたのではないかと思っている