業務でPower Automate for desktop でのRPA作成に携わることになり、日々試行錯誤しているので覚え書き。
仕様
- 某システムから吐き出されたCSVファイル(A)を読み込む
(UTF-8、項目はダブルクォーテーションで囲まれている) - 列を入れ替える、列を加えるなどの列操作
(前任者がここでExcelを使うRPAを書き、ID欄の0落ちが発生し大事故の過去) - 別のシステムに流し込むためにCSVファイル(B)に書き出す
(UTF-8、項目はダブルクォーテーションで囲む、改行コードLF)
※それぞれフォルダ操作、ファイル名作成などはある。
パッと見、初心者の私でも書けるような単純な仕様ではあるのですがあちこちにトラップがありました。
例えば2)、以前に「0落ち」で大事故を起こしているため、(そして会社という性質上)、まずはExcelを介さずに、安全安心に、CSVとPADのデータテーブルだけで叶えられないかを検討しなければなりませんでした。
今回は上記のうち、3)について。
読み込むCSVはテストとしてこんなものを用意しました。test.csv
項目はダブルクォーテーションで囲まれ、文字コードはUTF-8、改行コードはLFです。
Excelで単純に開くと見事にゼロ落ちしているのがわかります。
まずは PowerAutomate desktop で単純にCSVを読み込んでデータテーブルに格納し、名前を付けて保存します。
これで保存した「test_after.csv」をテキストエディタで開くと下図のようになっています。
ダブルクォーテーションがない上に、改行コードも「CRLF」になっています。
文字コードはUTF-8で保存ができました(上記で設定したので当たり前ですが…)。
あれこれ試行錯誤しましたが、スマートにPADの簡単な機能だけで「項目をダブルクォーテーションで囲む」「改行コードはLF」の両方をかなえるのは難しいと判断しました。
かといって、ここで書き出したCSVを再度サクラエディタで開いてダブルクォーテーションと改行コードを…とするのは、業務改善エンジニアとしてはとりたくない選択肢であります。
(実際のところ、業務ではこのような処理を大量にやるため、あとから一つ一つCSVを開くというのは、RPAの意味がなくなってしまいます。)
結論として、PAD内の機能、PowerShellにコードを書くことで、ダブルクォーテーション問題と改行コードLF問題を解決しました。
しかしながらPowerShellは全く知らない状態からのスタートだったため、2つのことを同時にやりたいと思いつつ、今のところは別々に実装しています。。。
CSVの項目にダブルクォーテーションをつける(PowerShell)
test_after.csv ⇒ test_wquote.csv
PADのフローにPowerShellを挿入します。
書いたコードは以下の通り。
Import-Csv -Path "D:\test_after.csv" -Encoding UTF8 | Export-Csv -Path "D:\test_wquote.csv" -NoTypeInformation -Encoding UTF8
test_after.csvを読み込んで、形式を指定して「test_wquote.csv」に書き出しているだけです。
途中、文字化けを起こしたりしましたが、「-Encoding UTF8」をつけることで解決しました。
文字化けが起こる場合は文字コードを確認しましょう。
CSVの改行コードを「LF」にする(PowerShell)
test_wquote.csv ⇒ test_wquote_lf.csv
PADのフローにPowerShellを挿入します。
書いたコードは以下の通り。
$lfText = [System.IO.File]::ReadAllText("D:\test_wquote.csv").Replace("`r`n","`n")
[System.IO.File]::WriteAllText("D:\test_wquote_lf.csv", $lfText)
これはCRLFの改行コードをLFに置換(Replace)する方法でした。
うまくいった!と思いきや、UTF-8Nになっちゃってるんですね…
ここはまた今度直したいと思います。
改行コードの変換は以下の記事を参考にしました。ありがとうございました。
https://teratail.com/questions/347291
現在仕事ではGAS、スプレッドシート関数、PowerAutomate desktopを主に触っているので、ほかの部分についても追い追い書いていきたいと思います。