(BizRobo)CSVの特定の値が含まれる行のみを抽出する方法
※以下は2020-05-09に投稿したものです。
CSVファイルの全行から値を抽出したいときは、CSVファイルをDS上で開き「データ行繰り返し」ステップを使用して全行ループで回るようにし、「データ行の列を抽出」ステップで値を抽出することが可能です。
フローにすると以下のような形ですね。
では、特定の列に特定の値が含まれる行のみを抽出したいときはどうでしょうか。
①特定の列から値を抽出
②変数に特定の値が含まれるかを判定
③値が含まれない場合は次のループに進ませる
そうですね、この方法で可能ですね。
フローにすると以下のような形になります。
この方法でももちろん問題ありません。
BizRoboの機能を使って可能な方法としてはこれがシンプルだと思います。
ただ、行数が数万行など非常に多かった場合はいかがでしょう。
ループを回すのに結構な時間がかかると思います。
はい、大量のデータ扱うならデータベースを使えというのはおっしゃる通りですが一旦無しでお願いします。
今回は別の方法もあるよ、という紹介です。
WindowsOSには「findstr」というコマンドがあるのはご存じでしょうか。
ファイルの中から文字列検索をするコマンドです。
詳しくはマイクロソフト社のページをどうぞ。
参考サイト:https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/findstr
文字列検索をして、特定の値が含まれるデータだけを抽出できるので、
ロボットから「コマンドライン実行」ステップでコマンドを入力し、
Long Text型の変数に戻り値を格納すればデータを抽出できるというわけです。
例えばこんなCSVファイルがあったとします。
中身は気にしないでください。適当です。
今回は2列目が「piyo」で始まる行を抽出しようと思います。
このファイルから「piyo」が含まれるデータだけ取り出すとすると、こんな感じになります。
◆コマンド
```
findstr piyo C:\Users\username\Desktop\test.csv
```
◆結果
```
"hoge","piyo","fuga"
"hoge","1piyo","fuga"
"hoge","piyo","fuga"
"piyo","ppiyo","fuga"
"hooge","piyo","fuuga"
```
見ての通りpiyoが含まれるデータだけが抽出されました。
しかし何列目かに関わらず「piyo」が含まれるものを全部抽出してしまったので
このままでは使えません。
ということで、正規表現の出番です。
以下のようにコマンドを打ちます。
今回は検索に指定する文字を正規表現で指定しています。
◆コマンド
```
findstr "^[^,]*,[^,]piyo" C:\Users\username\Desktop\test.csv
```
◆結果
```
"hoge","piyo","fuga"
"hoge","piyo","fuga"
"hooge","piyo","fuuga"
```
今回は2列目にpiyoが入っているものだけ抽出できました。
```
"^[^,]*,[^,]piyo"
```
ここの部分が正規表現を使ったところです。
もし3列目を指定したい場合は以下のように
```
*,[^,]
```
を増やしてあげてください。
```
"^[^,]*,[^,]*,[^,]piyo"
```
正規表現については慣れていないと何のこっちゃ?という感じになるかもしれませんが、
使いこなせると幅が広がるので勉強しておいて損はないと思います。
(私も使いこなせているかというと疑問ですが)
一般的な正規表現については以下が参考になるかと思います。
参考サイト:https://murashun.jp/blog/20190215-01.html
今回でいうと、以下の部分はカンマ以外の文字という意味ですね。
[^,]
なので、CSVデータはカンマ区切りデータということで、
カンマ以外の文字 カンマ カンマ以外の文字 カンマ...
という感じで対象にしたい列を区切っていってます。
さて、これをロボットに組み込むわけですが、
単純に設定するとこんな感じですね。
今回はベタ打ちですが、実際に使うときはコマンド内容やファイルパスを一旦変数に入れてエクスプレッションで組み合わせた方が後々のためにはいいと思います。
今回はBizRoboというよりはWindowsコマンドの話になりましたね。
RPA全般として、ツールだけ使える状態でも一通りのロボットは作れると思いますが、
PCそのものやネットワーク関係に詳しくなったり、HTMLの構造を理解できるようになるなど、
幅広い知識を持っていると対応できる範囲が広がると思います。
どなたがおっしゃっていたかは覚えておりませんが、「RPAは総合格闘技」というようなことを聞いたことがあります。
RPAのツールのことだけ学ぶのではなく、様々な技術を学び、総動員して戦うことが必要なのだと理解しました。
私はまだまだ勉強が足りない部分が多いので、精進あるのみです。
もともとITエンジニアの方は色々知識がある方が多いと思いますが、
そうでない方はITパスポートの勉強をしてみると色々といいと思います。
少なくともエンジニアではない一般的な方々の中ではIT全般に詳しい人になれると思います。
だいぶ長くなってしまいましたが、
今回も晩酌しながら書いているのでおかしな部分があればご指摘ください(笑)
あと、この方がもっといいよ!というようなことも歓迎です。
正直言ってWindowsコマンド詳しくないので詳しい方から見たら変なコマンドになっているかもしれないと思っています。