CSVファイルからデータベースにデータをインポートするというのは管理者にとっては必ず経験する作業だと思う。SQL Anywhereで
LOAD TABLE文を使ってCSVファイルをロードするための方法をいくつか書いてみたいと思う。
基本のやりかた
CSVファイルとテーブルの列数が一致する場合の一番基本のやり方。
次のようなテーブルがあって、
CREATE TABLE employee (
emp_id integer NOT NULL,
emp_name varchar(20) NOT NULL,
emp_comment long varchar,
PRIMARY KEY (emp_id)
)
次のようなCSVファイル
empdata.csv
があるとする。
ファイルの文字コードはエクセルから出力した場合と同じMS932であるとする。
"1","山田","がんばります"
"2","田中","はじめまして"
"3","池田","まあまあです"
この場合、テーブルとCSVファイルの列の数が一致しているので以下のようなSQL文でロードができる。
LOAD TABLE "employee" ("emp_id","emp_name","emp_comment")
FROM 'C:\Temp\empdata.csv'
FORMAT 'TEXT'
QUOTES ON
ORDER OFF
ESCAPES ON
CHECK CONSTRAINTS OFF
COMPUTES OFF
STRIP OFF DELIMITED BY ','
ENCODING 'Windows-31J'
FROM
にはCSVファイル名を絶対パスで指定する。コマンドラインから
dbisql
で実行するのであればカレントディレクトリからの相対パスで指定することもできる。
列の順番は
LOAD TABLE
文の列名を入れ替えることで好きな順序にできる。
デフォルト値をつける
データの各行にユニークIDを自動採番したいような場合や各行の作成時間を付与したい場合は、列にDEFAULT句を設定しておくとデータに含まれていなくても自動で値が割り振られる。
たとえば自動採番したIDを
emp_id
に入れ、作成時間を
created
に入れるため次のようなテーブルを定義する。
CREATE TABLE employee (
emp_id integer NOT NULL DEFAULT autoincrement UNIQUE,
emp_name varchar(20) NOT NULL,
emp_comment long varchar,
created datetime NOT NULL DEFAULT current timestamp,
PRIMARY KEY (emp_id)
)
データには
emp_name
と
emp_comment
のみが入っているとする。
"山田","がんばります"
"田中","はじめまして"
"池田","まあまあです"
この場合は以下のようなSQL文でロードができる。
LOAD TABLE "employee" ("emp_name","emp_comment")
FROM 'C:\Temp\empdata.csv'
FORMAT 'TEXT'
QUOTES ON
ORDER OFF
ESCAPES ON
CHECK CONSTRAINTS OFF
COMPUTES OFF
STRIP OFF DELIMITED BY ','
ENCODING 'Windows-31J'
DEFAULTS ON
DEFAULTS ON
をつけるところがポイント。これをつけないとDEFAULT句を持つ列にも値を明示的に入れないといけない。