先日紹介した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
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がやっぱりいいです。あとは文字コードのオプションが付けばなぁ。
Recent Posts
Tags
Official sites & docs
About
kenpg is an abbreviation for "kenkyu" (means research in Japanese) and postgres.
Main topics of this blog are how I use postgres, PostGIS, R and so on.