2017-07-13

複数のExcel単票から一覧表への変換

ここ数年、ウェブ上で公開される統計データの種類と量は急速に拡大してきました。製本された統計表を購入したり図書館で閲覧したりしなければならなかった頃を思うと、隔世の感を覚えます。

主要な政府統計は e-Stat (政府統計の総合窓口) で検索、閲覧、ダウンロードできますが、ダウンロードできるデータのうちExcel形式のものは、主に印刷物の形態で統計表を公開していた時代の名残なのでしょうか、印刷用に体裁が整えられているために、そのままではデータとして利用するのが難しいことがあります。

「神エクセル」というネットスラングがあるそうですが、その伝で言えば、e-Statで提供されているExcelデータにはかなり神がかっているものもあり、作成者も利用者も無用な労力=コストの支出を強いられているように思います。「働き方改革」が求められている昨今ですが、統計表に限らず、あらゆる文書について過度に体裁を整えるのを止めるだけでも、労働生産性の向上にかなり寄与できるのではないでしょうか。

また、印刷製本が必要だとしても、そのために体裁を整える作業はプロの印刷業者に任せれば良いことであって、その点では素人の公務員が手間ひまをかけるのは、非常にもったいないことであるとも思います。

閑話休題。印刷用の体裁にこだわるあまり、データとしては利用しにくいExcelワークシートでも、その「こだわり方」に規則性があるならば、FMEによって単純なテーブルに変換するのは容易かも知れません。

例えば、e-Statで公開されている「電力需要調査」(資源エネルギー庁)統計表 "kekka.xls" には、1四半期あたり1ワークシートの単票により、平成12年第2四半期から平成23年第1四半期までの44期分の調査結果 (ただし「高圧」は平成16年第2四半期以降) が収録されています (2017-07-13現在)。

ソース: e-Stat 電力需要調査結果「単票」 (1ブック, 44期分44ワークシート)
見るからに印刷用の様式です。ブック全体では、特別高圧: 9セル x 44期 (シート)  = 396セル, 高圧: 9セル x 28期 = 252セルにデータが記入されています。

















およそ10年分のデータが公開されているので、時系列での変動状況を知りたくなります。需要家別、項目別にデータを時系列で整理した一覧表があれば、項目ごとの変動状況を折れ線グラフ等で表現することはExcelの機能を使って簡単にでき、一目で変動状況が把握できますが、44ワークシートから必要なデータをひとつずつコピー・アンド・ペーストして一覧表を作成しなければならないとなると、気が滅入ります。

しかし、幸いなことに、44ワークシートは全て同じ様式で、データ項目ごとの記述先のセルの位置は決まっており、また、調査年・四半期が識別できるようにワークシート名の書式も統一されています。これならば、FMEによって、全てのデータ項目について時系列で整理した一覧表を一気に作成することができます。

ここでは、特別高圧、高圧の別に、全四半期の調査結果を時系列で整理した一覧表(Excelワークシート)に変換するワークスペース例を掲げます。結果は、次のようなテーブルになります。

変換結果: 電力需要調査結果「一覧表」 (1ブック, 2ワークシート:「特別高圧」「高圧」)
書式(フォントの種類・サイズ、数値の桁区切り・小数部桁数、列幅、罫線)は、変換後にExcelによって設定しました。この程度の書式設定ならば、1~2分もあれば誰にでもできることであり、仮に公開するとしても、これで十分であると考えます。
















FMEワークスペース例 (FME 2017.0.1.1 build 17291)

【ステップ1】





















[XLSXR] (Excel) リーダー: 電力需要調査結果Excelブック "kekka.xls" の全てのワークシートから、それぞれ 5~10 行目を読み込みます。それを行うためのパラメーターの設定は、次の [1]~[3] のとおりです。

[1] Excelリーダーをワークスペースに追加するとき、リーダーのパラメーター設定画面でワークシートをひとつ(図の例では「H12.4~6」)だけ選択し、フィールド名の行 (Field Names Row) の指定を解除します。これにより、Excelの列名 A, B, C, ... が各列のセルの値を格納する属性の名前となります。

ここで全てのワークシートを選択することもできますが、そうすると、全ワークシートについて、ひとつずつ Field Names Row の指定を解除しなくてはなりません。それは手間なので、ここではひとつのワークシートだけで設定を行い、後述するように、リーダーをワークスペースに追加した後で、全ワークシートを選択し直すことにしました。







































[2] 上記のパラメーター設定によってリーダーをワークスペースに追加した後、キャンバスに現れたフィーチャータイプで次の設定をします。

  • Merge Feature Type をチェック(任意のフィーチャータイプ名=ワークシート名を受け入れる)
  • Table セクションの Start Row, End Row で読込開始、終了行番号を指定
  • Format Attributes (フォーマット属性) タブで "fme_feature_type" (フィーチャータイプ名=ワークシート名を格納する属性) と "xlsx_row_id" (行番号を格納する属性) を現す (Expose)



























[3] そして、リーダーの Feature Types to Read (読み込むフィーチャータイプ) パラメーターで全てのフィーチャータイプ(ワークシート)を選択します。以上の設定により、実行時には、全てのワークシートの 5~10行目 が読み込まれることになります。

















TestFilter: 行番号 ("xlsx_row_id" の値) に応じて、フィーチャー(レコード)を「産業用」(5, 8行)、「業務用」(6, 9行)、「計」(7, 10行)に振り分けます。

AttributeRenamer x 3: TestFileter による振り分け先に応じて、C(販売電力量)、D(販売額)、E(単価)の属性名を変更します。

Aggregator: "fme_feature_type"(フィーチャータイプ名=入力ワークシート名=調査期)と "A"(需要家: 「特別高圧」または「高圧」)の組み合わせが同じフィーチャーを集約します。

ここまでで、需要家(出力先ワークシート)別に、調査期(出力先行)単位で [産業用, 業務用, 計] x [販売電力量, 販売額, 単価] 9項目のデータを属性として持つフィーチャーに変換されました。


【ステップ2】
















StringSearcher: "fme_feautre_type"(フィーチャータイプ名=入力ワークシート名)から「和暦年」と「四半期開始月」(1, 4, 7, 10)を抽出します。

AttributeManager: 入力ワークシート名から抽出した「和暦年」と「四半期開始月」に基づき、「西暦年」と「四半期番号」(1, 2, 3, 4)を求めるとともに、以後の処理では使わない属性を削除します。

AttributeManager パラメーター設定画面






































Sorter: フィーチャーの出力順を調査期(年、四半期番号)の昇順にします。

[XLSXW] (Excel) ライター: 需要家(属性A:「特別高圧」と「高圧」)別のワークシートに振り分けてフィーチャーを出力します。「年-四半期」列には、AttributeManager で作成した「西暦年」と「四半期番号」の値を含む文字列 "<yyyy>-Q<n>" (yyyy: 年, n: 四半期番号)を作成して出力しました。

ワークスペースの実行結果は、冒頭に示した変換結果: 電力需要調査結果「一覧表」のとおりです。

0 件のコメント:

コメントを投稿