PostgreSQLではCSVのインポートが簡単に行えます
CSVを用意した後、対応するテーブルをcreateしてしまえば、後はpsqlからcopyコマンドを実行するだけでインポートが完了します。Oracleの場合では、コントロールファイル(*1)を作成しないといけない事に対し、PostgreSQLは取り込むテーブルさえ適切に作成しておけばインポートできます。しかもかなりの高速だと思います。 (約37M、33万レコードのインポートに1.5秒です。当方の環境はノートPCにVirtualBOX入れその中での検証です)
(*1) コントロールファイルを使うとインポートする際いろんなデータ加工もできるので便利な面も当然あります。
今回は以下国土交通省のサイトからダウンロードできる住所CSVデータをインポートしてみました。
位置参照情報 ダウンロードサービス
丁目レベルのデータ取り込み
丁目レベルインポート
\copy kokudo_address_chome from '01000-15.0b\01_2021.csv' delimiter ',' csv header ;
上記はCSVの項目数と、テーブルカラム数が同じなのでテーブル名のみの記述で事足りているのですが、テーブル側にCSV以上のカラムを保持している場合対応するカラムを()内にカンマ区切りで記載する必要があります。ただし多くのカラムが存在する場合、copyコマンドの仕様として複数行に分けての記載ができないので「ながーい」コマンドになってしまうところがちょっと不便です。
オプション解説
- csv header 1行目をヘッダーとして認識します
丁目レベルインポート実行例
PS D:\ldrtest> ls 01000-15.0b\01_2021.csv
ディレクトリ: D:\ldrtest\01000-15.0b
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2022/03/03 13:46 2538925 01_2021.csv
PS D:\ldrtest>
PS D:\ldrtest> psql -U sooni -d myposdb -h vm022
psql (13.9、サーバ 13.6)
"help"でヘルプを表示します。
myposdb=# \timing
タイミングは on です。
myposdb=# \copy kokudo_address_chome from '01000-15.0b\01_2021.csv' delimiter ',' csv header;
COPY 25980
時間: 272.514 ミリ秒
myposdb=#
一点補足します。上記サイトからダウンロードするCSVファイルはShift_JIS+CRLFです。今回はWindows環境からpsqlを実行しているので、このCSVをそのまま取込できていますがLinux環境のpsqlを利用する際は、UTF-8+LFに変換する必要がありますのでご注意ください。
丁目レベル住所テーブル用DDL
create table kokudo_address_chome ( prefectures_code varchar(2), prefectures_name varchar(32), city_code varchar(5), city_name varchar(64), oaza_town_chome_code varchar(12), oaza_town_chome_name varchar(32), latitude numeric(11,8), longitude numeric(11,8), document_code integer, chome_kubun_code integer ); create unique index uni_idx_kokudo_address_chome on sooni.kokudo_address_chome (oaza_town_chome_code);
街区レベルのデータ取り込み
街区レベルインポート
\copy kokudo_address_gaiku from '01000-20.0a\01_2021.csv' delimiter ',' csv header ;
街区レベルインポート実行例
PS D:\ldrtest> ls 01000-20.0a\01_2021.csv
ディレクトリ: D:\ldrtest\01000-20.0a
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2022/02/24 19:42 37760681 01_2021.csv
PS D:\ldrtest>
myposdb=# \copy kokudo_address_gaiku from '01000-20.0a/01_2021.csv' delimiter ',' csv header;
COPY 339280
時間: 1497.096 ミリ秒(00:01.497)
myposdb=#
街区レベル住所テーブル用DDL
create table sooni.kokudo_address_gaiku ( prefectures_name varchar(32), -- 都道府県名 city_name varchar(64), -- 市区町村名 oaza_town_chome_name varchar(32), -- 大字・丁目名 koaza_alias varchar(64), -- 小字・通称名 block_number varchar(10), -- 街区符号 coordinate_system_number integer, --座標系番号 x_coordinate numeric(11,3), --X座標 y_coordinate numeric(11,3), --Y座標 latitude numeric(12,8), -- 緯度 longitude numeric(12,8), -- 軽度 residence_display_flag varchar(4), -- 住居表示フラグ represent_flag varchar(4), -- 代表フラグ before_update_history_flag varchar(4), -- 更新前履歴フラグ after_update_history_flag varchar(4) -- 更新後履歴フラグ );