EDINETコードリストを取得したい!
この記事はUiPathブログ発信チャレンジ2024サマーの9日目の記事です。
昨日はわたなべさん でした。
本記事は UiPath Studioにて『EDINETからコードリストのcsvファイルをダウンロードしてデータテーブルに入れる』処理を作成した時の記録です。
手こずった点や気づきが、いつかのどなたかの助けとなれれば幸いです。
EDINETとは
EDINET(電子開示システム)は金融庁が運営するシステムで、金融商品取引所に上場している会社が公表する財務諸表や有価証券報告書などの開示書類をインターネットを通じて公開するためのものです。
開示した期間や書類種別、業種等でも検索可能であり、また、無料で使用できるAPIも準備されています。
EDINETコードリストとは
EDINETで書類を開示している企業(個人を含む)の一覧です。主にAPIで書類取得をする際に使うことが多いです(理由は後述)。
証券コードや法人番号も入っていますので、このリストだけでも様々な用途に使えるデータです。
※証券コードは、予備コード桁が使われているので5桁表示です。左4桁が一般的に使われる証券コードです。
今回作成したフローと変数
EDINETコードリストをダウンロードし、csvの2行目をヘッダーにして別名保存するフローです。
手こずったポイント①
『CSVを読み込み(Read CSV)』Activityが使えない
csvファイルなので素直に『CSVを読み込み(Read CSV)』Activityを使おうとしたところ、エラーが出ました。
csvファイルを確認すると、ヘッダーが2行目から始まっています。
この形式の場合、Excelの『範囲を読み込み(Read Range)』ActivityでA2セルから読み取りすればOKです。
※代入(assign)Activityなどで、VB.netなりLinqなりでヘッダーをうにゃうにゃと修正する方法もありそうですが、そこらへんのコードはあまり知識がないこともあり、分かりやすさ優先で専用Activityを使っています。
手こずったポイント②
『範囲を読み込み(Read Range)』Activityの反応が無い
モダンの『範囲を読み込み(Read Range)』Activityの処理でさっぱり進まなくなり(10分以上経っても反応無し)、「固まった!?」とStudioを強制終了を数回したのち、このActivityはデフォルト設定のままだと非常に処理が重かった、ということを思い出せました。
重要なのは2点です。
・「表示行のみ」のオプションを外す
・「読み込む値の書式」を「RawValue」にする
この2点をこのように設定しない限り、『範囲を読み込み(Read Range)』Activityはほぼ使い物にならないと言っても過言ではないです。
この2点を設定しなおすだけで、処理速度がまともになります。(今回ですと、10分以上経っても処理が終わらない⇒2秒で読み込み完了でした)
初心者が使うActivityトップ10確実なActivityなので、UiPathのほうでこの設定をデフォルトにして欲しいです、切実に。
手こずったポイント③
『起動されたオブジェクトはクライアントから切断されました。』エラーが出る
処理が早くなったものの、今度は読み込み処理が速すぎてエラーが出るようになってしまいました。
解決方法を探したところ、こちらのブログが大変参考になりました。ありがとうございます。
【UiPath】起動されたオブジェクトはクライアントから切断されました。の対応策
工夫したポイント
EDINETコードリストはzipファイル内に唯一あるファイルなので、使用ファイル指定時に
ILocalResouse配列変数(0).LocalPath
で簡単にフルパスを設定出来ました。
(.LocalPathプロパティの存在を初めて知りました。これが無ければ、ファイルを展開(Unzip)Activityの『展開済みコンテンツのフォルダー』のフォルダーを設定して、それを.FullNameで引っ張ってきたファイル名と結合して、とかやっていました)
(余談)EDINETコードリストを取得するのは何故?
EDINETで使えるAPIは『書類一覧API』と『書類取得API』の2種類なのですが、この使い方が『一気に取得させる気が更々ない』と言わざるを得ない仕様になっておりまして。
まず『書類一覧API』で条件指定できるパラメータが期間しかない。
指定期間内にEDINETへ提出された書類すべてを、まずここで引っ張ってくるのです。
レスポンスは、以下のような内容です。
このレスポンスをもとに『書類取得API』を使うのですが、この時に使用できる条件指定パラメータは、書類フォーマット(PDFかcsvかzipか)とdocID(書類管理番号)のみ。
つまり、企業名や証券コードでフィルターして取得は出来ないのです。
そのため、取得したい企業が複数ある場合は事前にリストを作成しておいて、『書類一覧API』のレスポンスをフィルターする必要があります。
この時に便利なリストが『EDINETコードリスト』です。
取得したい企業のみにした『EDINETコードリスト』の『EDINETコード』で『書類一覧API』のレスポンスにある『edinetCode』をフィルターすることで、『書類取得API』を繰り返して書類をダウンロードするのに使えるのです。
UiPath×EDINET APIについては、後日またnoteに書…ければ、良いなぁ。