2021年6月1日火曜日

総務省が公表している【総計】令和2年1月1日住民基本台帳年齢階級別人口(市区町村別)のExcelファイルを読み込む

 政府CIOポータルのワクチン接種ダッシュボードでは、総務省が公開している住民基本台帳に基づく人口、人口動態及び世帯数内の【総計】令和2年1月1日住民基本台帳年齢階級別人口(市区町村別)を利用しているので、これをOracle APEXにロードしてみました。

多分、e-Statから見ると、このファイルに当たる情報ですが、ファイル名が異なるだけでファイル形式と内容は同じでした。

どちらもExcel 97-2004 ブック(.xls)形式でOracle APEXで読み込むにはExcelブック(.xlsx)に変換する必要があります。

政府CIOポータルからファイル000701583.xlsをダウンロードし、Oracle APEXを使ってデータベースにロードします。

ダウンロードしたファイルを開き、先頭行を削除した上でExcelブック(.xlsx)形式で保存します。ファイル名は000701583.xlsxとします。

SQLワークショップデータ・ワークショップを使って、データをロードすることができます。この場合、アプリケーションを作成する必要はありません。今回はロード処理は一度だけの作業なのでデータ・ワークショップで十分なのですが、あえてアプリケーションを作成してみます。

最初にデータのロード先となる表を作成し、続けてアプリケーションも作成します。SQLワークショップよりユーティリティクイックSQLを実行します。

モデルとして以下を入力します。

# prefix: egov
# semantics: default
population
municipality_code num
prefecture_name vc80
city_name vc160
gender vc8
total num
age00 num
age05 num
age10 num
age15 num
age20 num
age25 num
age30 num
age35 num
age40 num
age45 num
age50 num
age55 num
age60 num
age65 num
age70 num
age75 num
age80 num
age85 num
age90 num
age95 num
age100 num

SQLの生成SQLスクリプトの保存そしてレビューおよび実行を順次実行します。


SQLのレビュー画面では、アプリケーションの作成ではなく 実行をクリックします。


確認画面では、即時実行をクリックします。


表が作成されたら、アプリケーションの作成を実行します。確認画面が開くので、そこでもアプリケーションの作成をクリックします。

アプリケーションの名前人口統計とします。アプリケーションの作成をクリックします。

アプリケーションが作成されます。共有コンポーネントデータ・ロード定義を開きます。


作成済みのデータ・ロード定義の一覧画面が表示されます。作成をクリックします。


データ・ロードの作成として最初からを選択し、へ進みます。


データ・ロード定義の名前POPULATIONとしています。名前に日本語を使うこともできますが、その場合は静的IDがうまく生成されないため(日本語の文字は_ (アンダースコア)に置き換えられ、一意性が担保されない)、今回は英字のみで名前を付けました。ターゲット・タイプ表名として先程作成したEGOV_POPULATIONを選択します。へ進みます。


サンプル・ファイルとして、先頭行の削除と形式の変換を行なったファイル000701583.xlsxを指定します。へ進みます。


すべてのソース列にたいしてマップ先を割り当てます。列は沢山あるので、下までスクロールさせます。主キーの指定は不要です。ページの作成および追加を実行します。


データをロードするページの名前データのロードとします。へ進みます。


ナビゲーションのプリファレンスとして、新規ナビゲーション・メニュー・エントリの作成を選択します。へ進みます。


データ・ロードとしてPOPULATIONが選択され、最大ファイル・サイズ(MB)5であることを確認します。作成をクリックします。


データをロードするページが作成されるので、ページを実行します。


ファイルの選択をクリックし、000701583.xlsxを選択します。


プレビューが表示されるので内容を確認し、データのロードをクリックします。


データ・ロード終了:6834行が処理されました。と表示されます。


データのロードに成功しました。Populationのページを開き、都道府県のデータを参照します。フィルタとしてCity NameがNULLを設定します。


都道府県名として読み込んだデータの末尾に'*'(アスタリスク)がついていたり(おそらく都道府県全体の集計について*を付けているようですが、茨城県や栃木県など*が付いていない場合もあります)、男女も漢字のままでは扱いにくいので、データとしてのロード時に変換を行うようにしてみます。

共有コンポーネントデータ・ロード定義からPOPULATIONを開きます。設定ロード・メソッドを追加から置換へ変更します。その後、データ・プロファイルの編集を開きます。


データのトランスフォーメーションを設定する対象は、PREFECTURE_NAMEGENDERです。両方ともSQL式を使って変換します。

最初にPREFECTURE_NAMEを開きます。名前をPREFECTURE_NAMEからPREFECTURE_NAME_Rに変更します。表示可能OFFとします。変更の適用を行います。


列の追加を実行します。

元々Excelに含まれる列をPREFECTURE_NAME_Rとして読み込み、それをSQL式で変換したデータをPREFECTURE_NAMEとしてロードします。


名前PREFECTURE_NAME表示可能ON列タイプSQL式を選択します。SQL式として以下を指定します。(トランスフォーメーションのルール・タイプに置換がありますが、置き換え後の文字列として式2を必ず指定する必要があり、式1の文字列を削除するためには使用できません。)

replace(PREFECTURE_NAME_R,'*')

データ型は元々の定義と同じくVarchar2最大長80とし、作成を実行します。


続いてGENDERを開き名前GENDER_Rに変更します。表示可能OFFにし、変更の適用を行います。


列の追加を再度クリックし、データ・プロファイル列の追加を行います。名前GENDER表示可能ON列タイプSQL式を選択します。SQL式として以下を記載します。

decode(GENDER_R, '男', 'M', '女', 'F', '計', 'T', 'U')

データ型Varchar2最大長8とします。


データ・プロファイル列として、今までの列PREFECTURE_NAMEとGENDERが、PREFECTURE_NAME_R、GENDER_Rに変更されていることを確認します。


また、新たに列タイプがSQL式のPREFECTURE_NAMEとGENDERが追加されていることを確認し、変更の適用を実行します。


変更の適用をせずにデータ・プロファイルの編集を開くと、それまで画面に指定していた変更がリセットされるようです。今回はロード・メソッドですが、追加に戻っていたら置換に設定し直します。変更の適用を実行します。


アプリケーションを実行し、再度データのロードを行います。


データのロードに成功したら、Populationのレポートを同じ条件(City NameがNULL)で表示させ、結果を確認します。

Prefecture Name、Genderともに設定通りの変換が行われていることが確認できます。


以上でExcelファイルの読み込みは完了しました。

今回作成したアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/pref-population.sql

Oracle APEXのアプリケーション作成の参考になれば幸いです。