皆もすなるQiitaといふものを、儂もしてみむとてするなり。
と言う訳で、こん**は!はなっち!です。
この記事は、UiPath アドベントカレンダー 2022の22日目の記事です。
https://qiita.com/advent-calendar/2022/uipath
【初めに】
仕事で大文字小文字全角文字変換する必要性が出てきたので記録として残します。
外部からCSVファイル上のある列Cxの内容と、こちらで保有しているEXCELファイル上の列Exの内容とを比較して、合致するカテゴリに振り分けたい...
なんて要件があったりします。
その列Cxの中身は流石外部からのCSVファイル。半角カナ、全角カナ混在…orz
EXCELファイル側はワイルドカード指定でイケてるんだけど...
と言った場合、双方の「角」を揃えてあげて...この場合、EXCELファイル側の列Exは、ワイルドカード以外の半角を全角に変換してあげて、CSVファイル側の列Cxも素直に半角を全角に変換してあげてから評価してあげれば!
と、ポンを手を打って実装を始めた訳です。
今回は、半角から全角にする方法の試行錯誤の足跡をまとめてみました。
環境
【UiPathの仕様】
UiPath Studio |
---|
Studio 2022.10.3 - 2022/10/27 Enterprise License |
Microsoft Windows 11 Home 64 ビット |
6.0.7 |
【Windowsの仕様】
項目 | 値 |
---|---|
エディション | Windows 10 Pro |
バージョン | 21H2 |
OS ビルド | 19044.1766 |
エクスペリエンス | Windows Feature Experience Pack 120.2212.4180.0 |
1)素直にStrings.StrConvを使う
まぁ、基本的には、こんな構文で行ける訳で...
Microsoft.VisualBasic.Strings.StrConv(半角値.ToString, Microsoft.VisualBasic.VbstrConv.Wide, System.Globalization.CultureInfo.GetCultureInfo("ja-JP").LCID)
短く書くとこんな感じ
Strings.StrConv(半角値.ToString, VbstrConv.Wide, CultureInfo.GetCultureInfo("ja-JP").LCID)
構文としては、
Strings.StrConv
第一パラメタ:変換する文字列
第二パラメタ:変換したい型(全角へはWide,半角へはNarrow)
第三パラメタ:カルチャ(言語や地域固有の情報)を示すID(カルチャ識別子)
で、第三パラメタであるカルチャを示すIDは結構使うので、Int32型の変数(LocaleIDなど)へ代入アクティビティを使って、事前に設定しておくといいですね。
2)CSVから読み込んだDataTable上の列Cxと、EXCELから読み込んだDataTable上の列Exとに適用してみる。
(列Cx、列Exの列名称は、それぞれ"品目キーワード")
CSV側の列もEXCEL側のしっかり変換ロジックを組み込んで、いざ実行!となったら、以下のようなエラーメッセージが出た。
あれま。「No data is available for encoding 932」(932 をエンコードするためのデータがありません)!?「For information on defining a custom encoding, see the documentation for the Encoding.RegisterProvider method.」(カスタム エンコーディングの定義については、Encoding.RegisterProvider メソッドのドキュメントを参照してください。)!?
やれやれ、また難解なドキュメントを読まなきゃならないのか...
兎に角、「Encoding 932」って事は...Microsoftコードページ932を見ると、Shift-Jisが悪さしているのか!?
ん?待てよ!CSVからのDataTabelは半角⇒全角変換出来ていて、EXCELからのDataTableは出来ていない。この差はなんだ?
ファイル形式 | 列の属性 | 文字コード |
---|---|---|
CSV | String型 | 無指定(UTF-8?) |
Excel | Object型 | (Shift-Jis) |
3)だったら、一旦CSVにしてから、またCSVとして読み込めば、いいのでは?
と言う訳で、EXCEL側のDataTableをCSVに書き出し、それを即読込み、更にそのCSVファイルを何食わぬ顔して削除するってロジックを挿入してみた。
CSVのファイルは、アクシデントでファイル名が重複しない様に、時刻やMACアドレスなどを含むデータとして生成され、重複があっては困る状況で利用されるGUIDを利用する事にして...
これで「外部からCSVファイル上のある列Cxの内容と、こちらで保有しているEXCELファイル上の列Exの内容とを比較して、合致するカテゴリに振り分けたい」と言う要件は満たせました!でもねぇ。小手先のニゲでしかないですよね。
4)ちゃんとした対策方法がある!
「井の中の蛙大海を知らず」と言うように、まだまだ知らない事が多く、人様に訊いたら、あぁ、これを定義しておけばいいんではないでしょうか?との事。
それが、2)で出てきた、「For information on defining a custom encoding, see the documentation for the Encoding.RegisterProvider method.」(カスタム エンコーディングの定義については、Encoding.RegisterProvider メソッドのドキュメントを参照してください。)での方法でした(結局読んではいないのですが...)
その方法が、Invoke Methodアクティビティを使って、「System.Text.Encoding.RegisterProvider」を呼び出してあげる。
【Invoke Method】
設定値 | |
---|---|
TargetType | System.Text.Encoding |
TargetObject | - |
MethodName | RegisterProvider |
【Collection】
Direction | Type | Value |
---|---|---|
入力 | System.Text.EncodingProvide | System.Text.CodePagesEncodingProvider.Instance |
早速3)の対策ロジックを破棄し、実行してみたところ、すんなりと通りました!
【まとめ】
・要件から、まずプロトタイプでの実装をしてみましょう!
・要件を満たす方法である事が確認できたら、実装してみましょう!
・エラーが出てしまったら、まずはエラーを見て、検索してみましょう!
・英語サイトに出てくるでしょうから、周りに相談してみましょう!
・解法が見つかり、その方法を実装し、うまい事行ったら、他の人へアウトプットしてみましょう!
##おわりに
いかがでした?
EXCELからのDataTableでの半角⇒全角変換は、先の環境ではダメで、自分のPCで再現試験をしようとしたところ再現せず...PCの差は
【自分のPCのUiPathの仕様】
UiPath Studio |
---|
Studio 2022.10.3 - 2022/10/27 Community License |
Microsoft Windows 11 Home 64 ビット |
6.0.7 |
【自分のPCのWindowsの仕様】
項目 | 値 |
---|---|
エディション | Windows 11 Home |
バージョン | 22H2 |
OS ビルド | 22621.819 |
エクスペリエンス | Windows Feature Experience Pack 1000.22636.1000.0 |
でしたので、OSの差かと思います。
色々な環境でも安定して動くUiPathのロボットのため、出来るだけ環境に依存するのではなく、陽に定義、設定して行きたいものですね。
今回も読んでいただきありがとうございました!
是非UiPathでのロボ開発の一助になればと思っています。
ありがとうございました!