BluePrismでCSVファイルを一部リプレイスしたい
CSVを吐き出すシステムってあるけどさ、ユーザーが業務で使うときって
いろいろなカスタマイズが必要だよね。
もちろんCSVエクスポートの設計時に業務を加味したものを作るか、
あるいは業務をファイルにあわせるかすればいいんだろうけど。
ということで、作ってみましょう。
CSVを読みこんでリプレイスをかける
流れとしてはCSVを読み込んで変数に格納し、
変数に対してリプレイスをかけて
ファイルに保存するという流れです。
今回は1306 TOPIXインデックスファンドのcsvデータについて操作してみましょう。
▼こんなデータです。いやぁめっちゃ高くなってる。数年前は900とかだったのに……
まずはBlue PrismのVBO Utility - File Management:Read All Text from Fileで読み込む
▼読み込みたいCSVのパスを渡してやります
▼そして結果を受け取ります。
次に計算ステージでリプレイス
計算ステージでリプレイスをかけます。csvデータはread_result内に格納されています。
ret_patternに日付、new_textにdateを格納しておきます。
Replace([read_result], [rep_pattern], [new_text])
▼リプレイス。結果の保存先指定を忘れずに
では、リプレイス結果をUtility - FIle Management:Write Text Fileで出力
▼出力前に、元のファイルを消しておきます。まあ別名保存とかでもいいかもしれませんが。
▼そして、Utility - FIle Management:Write Text Fileでファイルを書き込みます。
▼そして汎用性を持たせるために、引数でファイルパス、リプレイス後文字列、リプレイス対象文字列を受け取るように設定しておきましょう。
よっしゃ実行。
余裕だな。これをループで回せばいいんだしね。
▼Opps! 文字化けてるじゃねーか。
▼ファイルを開けてみるとなんだかスのような文字がたくさん……
原因は文字コードに問題が……
▼既知の問題のようで……詳しくは下記ブログをご参照
-
Udemy APIコースの学習記録
Contents はじめにUdemy のAPI初級編【初心者向け】APIとは何か?1時間で開発やマーケティングでAPIが活用される理由と事例を紹介!Udemy のAPI初級編 Web API とスクレ ...
続きを見る
ということで、VBOのコードステージを手直し。
VBOをいじるときには別名で保存しておきましょう。Extendみたいな名前を付けてね。
対象のRead All Text from Fileを見てみると――
Dim sr As New StreamReader(File_Name)
調べてみるとStreamReaderのコンストラクタはオーバーロードされていて、
第一引数しか与えないと暗黙的にUTF-8でエンコードされるそうな。
StreamReader(String)
完全なファイルパスは path パラメーターによって指定されます。 このコンストラクターは、エンコーディングを UTF8Encoding に初期化し、バッファーサイズを1024バイトに初期化します。
https://docs.microsoft.com/ja-jp/dotnet/api/system.io.streamreader.-ctor?view=netframework-4.8#System_IO_StreamReader__ctor_System_String_
あーはん。
エンコードを受け取るコンストラクタ StreamReader(String, Encoding) が用意されているようで、
そちらを使ってあげることで、csvの文字コードにあわせた形で読み込むことができます。
つまりこう!
Dim sr As New StreamReader(File_Name, System.Text.Encoding.GetEncoding("shift_jis"))
ということは、エンコードも受け取れるように準備してあげたほうがいいか
あるいは、ShiftJIS以外のRead All Text from Fileも作っておくか、検討の余地はありそうです。
▼そして読み込むのを新しく用意したVBOを使います。
▼そして実行。ちゃんと読めている。
▼文字化けしていない! やったぜ
▼Oh…… つまり、書き込むときの文字コードもあかんかったのね。なんだか絶句みたいな感じで文字化けてるし。竈を囲んだよう文字もあるしわけわからん。
▼ということで、Write Text Fileもエンコードを変えてやって
▼無事リプレイスされた。
ちょっと癖あるな。