0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

XBRLをSQLで扱いたい?NuGetで使えるCLIツール『xbrlplus』を紹介

Posted at

はじめに

XBRLって聞いたことはあるけど、文法が複雑そうで触りたくない——そんな開発者、意外と多いのではないでしょうか。でもSQLならわかる。RDBなら扱える。そんな人に向けて、CLIツール『xbrlplus』を作りました。

xbrlplus は、XBRLファイルを読み込んでSQLite形式のDBに変換してくれるツールです。NuGetから dotnet tool としてインストールできるので、導入も簡単。XBRLの文法を知らなくても、SQLで中身を覗ける安心感があります。もちろん、アンインストールもコマンド一発でできるので合わなければサクッと捨ててください。

この記事では、「XBRLは避けたいけど、データは扱いたい」そんな開発者に向けて、xbrlplus の使い方と構造の魅力を紹介します。

インストール方法

xbrlplus は NuGet から dotnet tool としてインストールできます。開発環境に .NET SDK が入っていれば、以下のコマンドでグローバルに導入できます:

dotnet tool install --global xbrlplus

アンインストール方法

もし使ってみて「ちょっと違うな」と感じたら、以下のコマンドで簡単に削除できます:

dotnet tool uninstall --global xbrlplus

環境を汚さず、気軽に試せるのも xbrlplus の魅力のひとつです。

使い方の概要

xbrlplus は、XBRLインスタンス(.xbrl)やスキーマファイル(.xsd)を入力として受け取り、SQLite形式のリレーショナルデータベースに変換します。コマンドを実行すると、REPL(対話型SQLコンソール)が起動し、SQLで中身を直接確認できます。

以下は、スキーマファイル(2026年版EDINETタクソノミのエントリーポイントファイル)を指定して起動した例です:

F:\temp\2026\samples\2025-11-01>xbrlplus entryPoint_jpcrp020000-srs_2025-11-01.xsd
SQLite REPL is ready. Type SQL statements and end with ';' to execute. Type '.exit' to quit.
SQL> select * from VLabels limit 10;

出力例(先頭10件):

LabelId  NamespaceName  LocalName  Lang  Text  Role
-------  -------------  ---------  ----  ----  ----
1        ...            ...        ja    開示府令 第二号様式 有価証券届出書  ...
2        ...            ...        ja    企業内容等の開示に関する内閣府令 第二号様式 有価証券届出書 [目次項目] ...
3        ...            ...        en    Disclosure of Corporate Information Form No. 2 Securities Registration Statement ...
...
10       ...            ...        ja    企業内容等の開示に関する内閣府令 第二号の三様式 有価証券届出書 [目次項目] ...

REPLを終了するには .exit(または .quit, .q)を入力します。

SQL> .q

テーブル構造(リンク)

xbrlplus が生成するSQLiteのテーブル構造は、GitHubのREADMEで公開しています。

各テーブルの役割やカラム構成が明記されているので、SQLで扱う際の参考にしてください。

出力形式の柔軟性

xbrlplus のREPLでは、出力先と出力形式を柔軟に切り替えることができます。標準出力(コンソール)だけでなく、ファイルへの出力も可能です。

出力先の切り替え: .output コマンド

デフォルトではコンソールに出力されますが、.output <ファイル名> を使えばファイルに書き出すことができます。

SQL> .output
Output redirected to console.

SQL> .output sample.txt
Output will be written to 'sample.txt'.

SQL> select * from VLabels limit 10;
Output written to 'sample.txt'.

SQL> .output
Output redirected to console.

出力フォーマットの切り替え: .format コマンド

出力形式は table(表形式), csv, json の3種類から選べます。デフォルトは table です

SQL> .format
Current format: table
Usage: .format [table|csv|json]

SQL> .format csv
Output format set to 'csv'.

SQL> .format
Current format: csv

SQL> .format json
Output format set to 'json'.

ユースケース

XBRLインスタンスから特定の概念(要素)の値をまとめて取り出す場合

ここでは、2025年版EDINETタクソノミとともに公開されているサンプルインスタンスを使って、【主要な経営指標等の推移】から売上高の情報を抽出するケースを紹介します。

この売上高は、 NetSalesSummaryOfBusinessResults というタグで記述されていることがわかっているものとします(※タクソノミ要素リストから確認できます)。

この場合は、ビュー VFacts に対して LocalName を指定することで、該当データを抽出できます:

F:\temp\2025\ダウンロードデータ\02_開示府令-有価証券報告書\S002XXXX\XBRL\PublicDoc>xbrlplus jpcrp030000-asr-001_X99001-000_2025-03-31_01_2025-06-28.xbrl
SQLite REPL is ready. Type SQL statements and end with ';' to execute. Type '.exit' to quit.
SQL> select Nil, Decimals, Value, ContextName, StartDate, EndDate from VFacts where LocalName = 'NetSalesSummaryOfBusinessResults';

出力例:

Nil     Decimals        Value   ContextName     StartDate       EndDate
---     --------        -----   -----------     ---------       -------
0       -6      231282000000    Prior4YearDuration      2020-04-01      2021-03-31
0       -6      273802000000    Prior3YearDuration      2021-04-01      2022-03-31
0       -6      303080000000    Prior2YearDuration      2022-04-01      2023-03-31
0       -6      316934000000    Prior1YearDuration      2023-04-01      2024-03-31
0       -6      323609000000    CurrentYearDuration     2024-04-01      2025-03-31
0       -6      130747000000    Prior4YearDuration_NonConsolidatedMember        2020-04-01      2021-03-31
0       -6      154886000000    Prior3YearDuration_NonConsolidatedMember        2021-04-01      2022-03-31
0       -6      183448000000    Prior2YearDuration_NonConsolidatedMember        2022-04-01      2023-03-31
0       -6      196499000000    Prior1YearDuration_NonConsolidatedMember        2023-04-01      2024-03-31
0       -6      210346000000    CurrentYearDuration_NonConsolidatedMember       2024-04-01      2025-03-31

10 row(s) selected.

表示リンクの構成を確認する

同じデータを使って、今度は表示リンク(表示上の項目の並び)がどのように定義されているかを見てみます。

まず、どんな表示リンクのツリーが存在するかを確認するには、ビュー VPresentationLinkNodes からロール定義(Definition)を一覧で取り出します

SQL> select distinct Definition from VPresentationLinkNodes order by Definition;
Definition
----------
010300 開示府令 第三号様式 有価証券報告書
020000 表紙
210000 連結経営指標等
211000 提出会社の経営指標等
212000a 従業員の状況
...
410010i セグメント情報等、連結財務諸表(負ののれん発生益)

55 row(s) selected.

このなかから、たとえば020000 表紙の項目構成を確認したい場合は、以下のように Definition を指定して並び順(Seq)で取得します:

SQL> select LinkNodeId, ParentId, Depth, ArcOrder, PreferredLabel, LocalName
   > from VPresentationLinkNodes where Definition = '020000 表紙'
   > order by Seq;

出力例:

LinkNodeId      ParentId        Depth   ArcOrder        PreferredLabel  LocalName
----------      --------        -----   --------        --------------  ---------
238         0                          CoverPageHeading
239         238       1      1                         DocumentTitleCoverPage
240         238       1      2                         ClauseOfStipulationCoverPage
...
253         238       1      15                        PlaceForPublicInspectionCoverPageTextBlock

16 row(s) selected.

この結果から、CoverPageHeading がルートノード(最上位)であり、その下に DocumentTitleCoverPage から PlaceForPublicInspectionCoverPageTextBlock までの項目が並列に並んでいることがわかります。

おわりに

今後は、リモートファイルのキャッシュやプロキシ対応、TDnetのようにXBRLインスタンスが存在しない(inlineXBRLのみの)データへの対応など、機能拡張も検討しています。

ツールの詳細やテーブル構造については、以下のリンクをご覧ください:

テーブル構造の改善にも取り組んでいきたいので、利用者のご意見は大歓迎です。
気になる点や要望があれば、GitHubの issue に書いていただけるととても嬉しいです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?