先日紹介したOGR_FDWとの比較で。今頃知ったのですがSQLite3のコマンドラインツールは、CSV等のテキストデータを「列定義不要」で簡単にテーブル化できると判明。例えば次のように。
$ sqlte3 test_sqlite3.db
SQLite version 3.12.2 2016-04-19 15:16:33
Enter ".help" for usage hints.
sqlite> .mode csv
sqlite> .import 'WHO_Tuberculosis/TB_strategy_2016-02-15.csv' TB_strategy
sqlite>
sqlite> .schema TB_strategy
CREATE TABLE TB_strategy(
  "country" TEXT,
  "iso2" TEXT,
  "iso3" TEXT,
  "iso_numeric" TEXT,
  "g_whoregion" TEXT,
  "year" TEXT,
  "xpert_in_guide_TBHIV" TEXT,
  "xpert_in_guide_MDR" TEXT,
  "xpert_in_guide_tb" TEXT,
  "xpert_in_guide_children" TEXT,
  "xpert_in_guide_eptb" TEXT,
  "eol_care" TEXT,
  "caseb_err_nat" TEXT,
  "hcw_tb_infected" TEXT,
  "hcw_tot" TEXT,
  "pub_new_dx" TEXT,
  "priv_new_dx" TEXT,
  "mdr_tx_nonntp" TEXT
);
sqlite> select * from tb_strategy;


環境による差はないと思いますが一応、実行環境はWindows7 x64 + Cygwin + SQLite 3.12.2です。

インポートしてみたCSVはこちら。以前も使ったWHOの結核に関する国別データです。リンク元はここ。インポート結果の確認と元CSVの画像を作ったものの、カンマと二重引用符が多くて何かキモいのでリンクだけにします。

» 画像:テーブルをselect
» 画像:CSVの先頭

今回使ったコマンドは.mode.importで、詳細は下記ドキュメントでSpecial commands to sqlite3 (dot-commands)を参照。CSV以外の形式(例えばタブ区切り)を.modeで指定すれば同様にできそう。

»www.sqlite.org/cli.html

↓ ドキュメントから.modeの記述を引用。一見outputのみに関するコマンドのようで、でもimportにも作用するのでした。
.mode MODE ?TABLE?     Set output mode where MODE is one of:       
    ascii    Columns/rows delimited by 0x1F and 0x1E
    csv      Comma-separated values
    column   Left-aligned columns.  (See .width)
    html     HTML <table> code
    insert   SQL insert statements for TABLE
    line     One value per line
    list     Values delimited by .separator strings
    tabs     Tab-separated values
    tcl      TCL list elements



ただ、先頭行がヘッダになってない変則的なCSVは残念ながら無理っぽい。例えば
先日OGR_FDWで取り込めた日本の国勢調査データ(総務省統計局)が、こちらではエラーになって駄目。
sqlite> .import 'estat/00320.csv' estat_00320
CREATE TABLE estat_00320(...) failed: duplicate column name:


用いたのは ↓ から表3-2
(00320.csv)をダウンロードしUTF-8に変換したもの。この画像もカンマ・二重用符が多くて何かキモいのでリンクだけ。エラーメッセージは列名の重複とあるけど、元CSVは先頭行の大半が空。念のため.headersコマンドのON/OFF両方で試し、同じ結果でした。

» 平成22年国勢調査 > 人口等基本集計 > 全国結果


というわけで、ヘッダ行がちゃんとある普通のCSVには便利。そうでない国勢調査みたいな変なCSVは、自動で列名が付くOGR_FDWがやっぱりいいです。あとは文字コードのオプションが付けばなぁ。