CSVファイルをPostgreSQLにロードするツール(csv2postgresql)を作りました

CSVファイルをPostgreSQLにロードするツールを作りました。

事前にテーブルを作っておく必要は無いので、とりあえずCSVファイルをPostgreSQLにロードしていじりたいって時に便利かと思います。

テーブルはCSVのヘッダに記載のフィールド名を元に作成されます。なお、既にテーブルがある場合は作りません。

内部的にはCOPYコマンドを使っているので、とても早いと思います。(もともとバッチINSERTを使った実装をしていましたが、COPYコマンド使うように変えたら50倍早くなりました)

利用方法

実行にはJava(JDK8以上)が必要となります。

下記から最新の実行ファイル(csv2postgresql-x.x.x-all.jar)を入手します。

入手したjarファイルを指定してアプリケーションを実行します。

java -jar csv2postgresql-1.0.0-all.jar config.properties table1 data.csv

引数は下記の通りです。

  1. 設定ファイルパス
  2. テーブル名
  3. CSVファイルパス

実行すると、下記のように処理したレコード件数、かかった時間が出力されます。

Loading...
Loading is completed. (Number of records: 100,000 / Elapsed millsecods: 322)

設定ファイル

設定ファイルには、PostgreSQLの接続先情報と、CSVファイルのエンコーディングを記載します。

  • database.url JDBC接続URL
  • database.user DBユーザ名
  • database.password DBパスワード
  • csv.encoding CSVファイルのエンコーディング

以下は例です。

database.url=jdbc:postgresql://192.168.33.10:5432/testdb
database.user=user1
database.password=pass1
csv.encoding=UTF-8

テーブル名

ロード先のテーブル名を指定します。

テーブルが存在しなかった場合、新規にテーブルを作成します。この際、各カラムはtext型として作成されます。

CSVファイル

CSVファイルのヘッダは必須です。ヘッダに記載のフィールド名を使って、ロード先のテーブルのカラムとマッピングします。 なお、英数字以外の文字が指定されていた場合、アンダースコア(_)に置換されます。

たとえばUser Nameというフィールドがあった場合、データベースのカラムとしてはuser_nameにマッピングされます。

サンプル

PostgreSQLを起動するためのVagrant環境と、設定ファイルとCSVファイルのサンプルが用意してあります。 これらを使うことによって、簡単に本ツールを試せます。

vagrantフォルダにてvagrant upを実行すると、PostgreSQL11をインストールした仮想環境(192.168.33.10)が立ち上がります。

sampleフォルダ配下の設定ファイルとCSVファイルを利用してロードを行います。

java -jar csv2postgresql-1.0.0-all.jar sample/config.properties test_table sample/sample-100000.csv

ビルド方法

ソースコードからビルドして利用する場合、Java(JDK8以上)がインストールされた環境で、下記コマンドでアプリケーションをビルドします。

gradlew shadowJar

build/libs/csv2postgresql-x.x.x-all.jarという実行ファイルが出来上がります。(x.x.xはバージョン番号)