2012年1月20日金曜日

SQL Anywhere CSVファイルをテーブルにロードする

CSVファイルからデータベースにデータをインポートするというのは管理者にとっては必ず経験する作業だと思う。SQL AnywhereでLOAD TABLE文を使ってCSVファイルをロードするための方法をいくつか書いてみたいと思う。

基本のやりかた


CSVファイルとテーブルの列数が一致する場合の一番基本のやり方。

次のようなテーブルがあって、
  1. CREATE TABLE employee (  
  2.     emp_id      integer NOT NULL,  
  3.     emp_name    varchar(20) NOT NULL,  
  4.     emp_comment long varchar,  
  5.     PRIMARY KEY (emp_id)  
  6. )  


次のようなCSVファイルempdata.csvがあるとする。
ファイルの文字コードはエクセルから出力した場合と同じMS932であるとする。
"1","山田","がんばります"
"2","田中","はじめまして"
"3","池田","まあまあです"


この場合、テーブルとCSVファイルの列の数が一致しているので以下のようなSQL文でロードができる。
  1. LOAD TABLE "employee" ("emp_id","emp_name","emp_comment")  
  2.      FROM 'C:\Temp\empdata.csv'  
  3.      FORMAT 'TEXT'  
  4.      QUOTES ON  
  5.      ORDER OFF  
  6.      ESCAPES ON  
  7.      CHECK CONSTRAINTS OFF  
  8.      COMPUTES OFF  
  9.      STRIP OFF DELIMITED BY ','  
  10.      ENCODING 'Windows-31J'  


FROMにはCSVファイル名を絶対パスで指定する。コマンドラインからdbisqlで実行するのであればカレントディレクトリからの相対パスで指定することもできる。
列の順番はLOAD TABLE文の列名を入れ替えることで好きな順序にできる。

デフォルト値をつける


データの各行にユニークIDを自動採番したいような場合や各行の作成時間を付与したい場合は、列にDEFAULT句を設定しておくとデータに含まれていなくても自動で値が割り振られる。

たとえば自動採番したIDをemp_idに入れ、作成時間をcreatedに入れるため次のようなテーブルを定義する。
  1. CREATE TABLE employee (  
  2.     emp_id      integer NOT NULL DEFAULT autoincrement UNIQUE,  
  3.     emp_name    varchar(20) NOT NULL,  
  4.     emp_comment long varchar,  
  5.     created   datetime NOT NULL DEFAULT current timestamp,  
  6.     PRIMARY KEY (emp_id)  
  7. )  


データにはemp_nameemp_commentのみが入っているとする。
"山田","がんばります"
"田中","はじめまして"
"池田","まあまあです"


この場合は以下のようなSQL文でロードができる。
  1. LOAD TABLE "employee" ("emp_name","emp_comment")  
  2.      FROM 'C:\Temp\empdata.csv'  
  3.      FORMAT 'TEXT'  
  4.      QUOTES ON  
  5.      ORDER OFF  
  6.      ESCAPES ON  
  7.      CHECK CONSTRAINTS OFF  
  8.      COMPUTES OFF  
  9.      STRIP OFF DELIMITED BY ','  
  10.      ENCODING 'Windows-31J'  
  11.      DEFAULTS ON  


DEFAULTS ONをつけるところがポイント。これをつけないとDEFAULT句を持つ列にも値を明示的に入れないといけない。

0 件のコメント:

コメントを投稿