eSTATの小地域(町丁・字等別)毎の年齢(5歳階級、4区分)別、男女別人口をSQL ServerにBULK INSERTする

 2020 年の国勢調査の結果がようやくeSTATに反映された.日本の市区町村よりも粒度の細かい小地域(町丁・字等別)の人口構成が公表されたのは2022年6月24日付である.今回はこのデータをSQL Serverに取り込んでみたい.

データのダウンロード

 eSTATトップページの「地図 地図上に統計データを表示(統計GIS)」をクリックする.

eSTATトップページの「地図 地図上に統計データを表示(統計GIS)」
eSTATトップページの「地図 地図上に統計データを表示(統計GIS)」

 「統計データダウンロード」をクリックする.

統計データをダウンロード
統計データをダウンロード

 「国勢調査」をクリックする.

国勢調査
国勢調査

 「2020年」「小地域(町丁・字等別)」「年齢(5歳階級,4区分)別,男女別人口」の順にクリックする.

「2020年」「小地域(町丁・字等別)」「年齢(5歳階級,4区分)別,男女別人口」
「2020年」「小地域(町丁・字等別)」「年齢(5歳階級,4区分)別,男女別人口」

 都道府県別の統計表の画面に遷移する.CSVをクリックするとファイルがダウンロードされる.すべての都道府県のファイルをダウンロードする.

都道府県別の統計表がテキストファイルでダウンロードできる
都道府県別の統計表がテキストファイルでダウンロードできる

 「ダウンロード」フォルダに下図のようなzipファイルがダウンロードされる.

zipファイルでダウンロードされる
zipファイルでダウンロードされる

 開いてみると拡張子が.txtのテキストファイルである.zipファイル内から任意のフォルダーに移動・コピーしておく.メモ帳で編集できる.

拡張子が.txtとなっている
拡張子が.txtとなっている

データクレンジング

ヘッダーの整形

 ヘッダーが2行にわたっており,1行にする必要がある.Tで始まる列コードから「総数」の直前まで選択し,削除する.

メモ帳で開き,ヘッダーを整形する
メモ帳で開き,ヘッダーを整形する

記号の置換

 所々に記号が存在するため,0で置換する.図で示した以外にも記号があるかもしれない.47個のファイル全てに行う.

記号を0で置換する
記号を0で置換する
記号を0で置換する
記号を0で置換する

SQL Serverへのインポート

ウィザードを使ってテーブル作成SQLを取得する

 SQL Serverの任意のデータベースを右クリックして「タスク」「データのインポート…」と進み,ウィザードを起動する.下図は「マッピングの編集」画面でデータ型とデータ長を指定し終わったところである.

SQL Serverのテキストインポートウィザードの列マッピング
SQL Serverのテキストインポートウィザードの列マッピング

 上図で「SQLの編集…」ボタンをクリックすると下図のようにCREATE TABLE ステートメントが現れるので,これをコピーしてメモ帳に貼り付け,拡張子を.sqlとして保存する.ウィザードは途中でキャンセルする.

SQL Serverのテーブル作成SQLステートメント
SQL Serverのテーブル作成SQLステートメント

CREATE TABLEステートメント

 上図で保存したCREATE TABLEステートメントを実行してテーブルを作成する.

BULK INSERTステートメント

 下記コードはDropBox内の任意のフォルダにあるファイルをSQL ServerのT_5YEARS_POPULATIONというテーブルにBULK INSERTするステートメントである.

 FIELDTERMINATORとはデリミタのことである.ROWTERMINATORとは改行コードを指す.FIRSTROW = 2とは1行目のヘッダーを飛ばして2行目から読み込むことを示す.

 ファイル名は01から47までの連番となっており,FROM句のパスのファイル名を書き換えて都度F5キーを押下し,47個すべてのファイルをテーブルに読み込む.

BULK INSERT	T_5YEARS_POPULATION
FROM	'C:\Users\UserName\Dropbox\DataFile\tblT001082C01.txt'
WITH	(
	FIELDTERMINATOR = ',',
	ROWTERMINATOR = '\n',
	FIRSTROW = 2
	)

ログ

 北海道と東京都のファイルでエラーが出た.北海道では2行のデータがエラーとなった.北海道のファイルは25699件あり,テーブル内の行数とエラーの件数の合計に一致する.東京都では1行のエラーが出た.この程度でやむなしとするか否か,難しい判断である.今回はBULK INSERTステートメントを試すために行った実験であり,これで良しとした.

メッセージ 4864、レベル 16、状態 1、行 3
行 9302、列 7 (GASSAN) の一括読み込みデータ変換エラー (型の不一致または指定されたコードページでは無効な文字)。
メッセージ 4864、レベル 16、状態 1、行 3
行 9327、列 7 (GASSAN) の一括読み込みデータ変換エラー (型の不一致または指定されたコードページでは無効な文字)。
SELECT	*	FROM	dbo.T_5YEARS_POPULATION
(25697 行処理されました)

(5100 行処理されました)
(4454 行処理されました)
(5943 行処理されました)
(4878 行処理されました)
(5077 行処理されました)
(7380 行処理されました)
(4925 行処理されました)
(2923 行処理されました)
(2689 行処理されました)
(7095 行処理されました)
(6767 行処理されました)
メッセージ 4864、レベル 16、状態 1、行 3
行 6786、列 7 (GASSAN) の一括読み込みデータ変換エラー (型の不一致または指定されたコードページでは無効な文字)。
(6128 行処理されました)
(8648 行処理されました)
(3992 行処理されました)
(3764 行処理されました)
(3218 行処理されました)
(1493 行処理されました)
(4098 行処理されました)
(8910 行処理されました)
(5401 行処理されました)
(16694 行処理されました)
(3624 行処理されました)
(3092 行処理されました)
(9802 行処理されました)
(10617 行処理されました)
(11121 行処理されました)
(3491 行処理されました)
(2667 行処理されました)
(2893 行処理されました)
(1442 行処理されました)
(6103 行処理されました)
(4976 行処理されました)
(4727 行処理されました)
(1754 行処理されました)
(1028 行処理されました)
(3345 行処理されました)
(2450 行処理されました)
(9146 行処理されました)
(2567 行処理されました)
(4033 行処理されました)
(3234 行処理されました)
(2550 行処理されました)
(2808 行処理されました)
(1928 行処理されました)
(1496 行処理されました)
SELECT	*	FROM	dbo.T_5YEARS_POPULATION
(253035 行処理されました)

まとめ

 2020年の国勢調査の小地域(町丁・字等別)毎の年齢(5歳階級、4区分)別、男女別人口をSQL Server にBULK INSERTした.ウィザードを使ってエラーが発生すると途中で処理が止まるが,BULK INSERTステートメントはエラーの発生した行を飛ばして処理を継続するようである.

 データ型の制約のため,-やXなどの記号を0で置換した.後で問題になるかもしれない.

 総務省に望むのは,データファイルのヘッダー行を1行にしておいてほしいということである.

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください