PostgreSQL

PostgreSQL CSVインポート

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)   -- 更新後履歴フラグ
);

後でOracleと比較

スポンサーリンク
コピペで使う