XULRunnerをベースに開発された「Songbird」の最新リリース候補が出ています。安定性とかiPodのサポートとか、iTunesと比べると見劣りする部分も多いのですが、以前に比べてグッと品質が向上しています。このジュークボックスソフト、ウォークマンをサポートするようになれば、かなり人気が出ると思うのですが。OS Xな皆さんも、一度試す価値アリです。

さて、今回は「CSVファイル」について。OS Xとは特に関係のない、カンマ区切りでデータが並んだテキストファイルの一種だが、データそのものに属性を持たせる必要がないデータベースソフトには必要にして十分。特定のOS / アプリケーションに依存しないだけに、異種DB間でのデータのやり取りには最適なファイルフォーマットだったりする。それをOS X標準装備の「SQLite」で使おう、という主旨だ。

sqlite3コマンドの使い方

sqlite3コマンドの基本形は、オプション、最初の引数としてデータベースファイル、2番目の引数にSQLコマンドの順だが、SQLコマンドを指定する代わりに(SQLコマンドをら列した)ファイルを利用できることがポイント。それを実行例1の要領でリダイレクトで入力すれば、コマンドライン1行でテーブルやインデックスを作成できてしまう。

sqlite3コマンドの書式

sqlite3 [options] DBファイル SQLコマンド

実行例1: データベース(テーブル)の作成

$ sqlite mydatabase.db < sqlcommand.sql

データベースを利用するにあたっては、最初にテーブル(情報の入れ物)を作成することになる。SQLiteでは、厳密な型が設けられていないため、ある意味適当にカラムだけ設定しておけばOK。たとえば、リスト1の内容を「sqlcommand.sql」として保存し、実行例1のとおりコマンドを実行すれば、3桁のカラムを持つテーブル「test」が作成されるはずだ。

リスト1: テーブル作成用のSQLコマンドリスト

create table test (
        no1 text not null,
        no2 text not null,
        no3 text not null
);

郵便番号DBをつくろう

空のDBを作ったところでなんの役にも立たないため、実用的なものを作成してみよう。題して「郵便番号DB」、その名のとおり日本郵政が公開している郵便番号データを拝借、DB化してしまおうというものだ。まずは適当な都道府県のデータ(LZH形式)をダウンロードし、解凍しておこう。

解凍したデータは、シフトJISでエンコードされているうえ、各データは「"」で囲まれ、行末には余分な改行コード「\r」が付いている。以下のとおりコマンドを実行し、UTF-8エンコードかつ不要な記号を取り除いた「POSTNUM.csv」を作成しよう。ちなみに、ファイルメーカーの個人向けデータベース「Bento」で利用する場合には、1行目だけ実行すればOKだ。

実行例2: 日本郵政の郵便番号データを加工する

$ iconv -f SJIS -t UTF-8 < filename.CSV > temp.csv
$ cat temp.csv | tr -d '"' | tr -d "\r" > POSTNUM.csv

続いて、CSVファイルを流し込むためのテーブルを作成する。POSTNUM.csvをテキストエディタで開いてみればわかるが、1行は数値 / テキストが混在する9桁と数値のみの6桁の計15桁から構成されている。このフォーマットにあうよう、リスト1の要領でSQLコマンドファイルを作成すればいいわけだ (リスト2)。それを「maketable.sql」というファイル名で保存し、実行例3のとおりコマンドを実行すれば、CSVファイルを流し込むための容器「POSTNUM」テーブルが完成する。

リスト2: テーブル作成用のSQLコマンドリスト

create table POSTNUM (
        no1 text not null,
        no2 text not null,
        no3 text not null,
        no4 text not null,
        no5 text not null,
        no6 text not null,
        no7 text not null,
        no8 text not null,
        no9 text not null,
        no10 integer not null,
        no11 integer not null,
        no12 integer not null,
        no13 integer not null,
        no14 integer not null,
        no15 integer not null
);

実行例3: テーブルを作成する

$ sqlite3 POST.db < maketable.sql

次はいよいよCSVファイルの流し込み。以下のとおりコマンドを実行し、インポートを完了しよう。なお、「-separator」オプションは、あとに続く文字(,)を区切り記号として使用するという意味。2番目の引数はsqlite3の内部コマンドで、ファイル(POSTNUM.csv)をテーブル(POSTNUM)にインポートするという意味だ。

実行例4: CSVファイルをテーブル「POSTNUM」にインポートする

$ sqlite3 -separator , POST.db ".import POSTNUM.csv POSTNUM"

これで、郵便番号DBは一応完成。インデックスの作成など手順をいくつか省略しているが、データ検索には十分活用できる。まずは以下のコマンドを実行してみよう。日本郵政から入手したデータが全国版の場合、マイコミジャーナル編集部のある千代田区一ツ橋のデータが表示されればOKだ。

実行例5: 郵便番号で検索する

$ sqlite3 POST.db "select * from POSTNUM where no3='1000003';"

自分の住所の郵便番号で検索してみよう