【コラム】
XULRunnerをベースに開発された「Songbird」の最新リリース候補が出ています。安定性とかiPodのサポートとか、iTunesと比べると見劣りする部分も多いのですが、以前に比べてグッと品質が向上しています。このジュークボックスソフト、ウォークマンをサポートするようになれば、かなり人気が出ると思うのですが。OS Xな皆さんも、一度試す価値アリです。
さて、今回は「CSVファイル」について。OS Xとは特に関係のない、カンマ区切りでデータが並んだテキストファイルの一種だが、データそのものに属性を持たせる必要がないデータベースソフトには必要にして十分。特定のOS / アプリケーションに依存しないだけに、異種DB間でのデータのやり取りには最適なファイルフォーマットだったりする。それをOS X標準装備の「SQLite」で使おう、という主旨だ。
sqlite3コマンドの基本形は、オプション、最初の引数としてデータベースファイル、2番目の引数にSQLコマンドの順だが、SQLコマンドを指定する代わりに(SQLコマンドをら列した)ファイルを利用できることがポイント。それを実行例1の要領でリダイレクトで入力すれば、コマンドライン1行でテーブルやインデックスを作成できてしまう。
sqlite3コマンドの書式
sqlite3 [options] DBファイル SQLコマンド
$ sqlite mydatabase.db < sqlcommand.sql
データベースを利用するにあたっては、最初にテーブル(情報の入れ物)を作成することになる。SQLiteでは、厳密な型が設けられていないため、ある意味適当にカラムだけ設定しておけばOK。たとえば、リスト1の内容を「sqlcommand.sql」として保存し、実行例1のとおりコマンドを実行すれば、3桁のカラムを持つテーブル「test」が作成されるはずだ。
create table test (
no1 text not null,
no2 text not null,
no3 text not null
);
空のDBを作ったところでなんの役にも立たないため、実用的なものを作成してみよう。題して「郵便番号DB」、その名のとおり日本郵政が公開している郵便番号データを拝借、DB化してしまおうというものだ。まずは適当な都道府県のデータ(LZH形式)をダウンロードし、解凍しておこう。
解凍したデータは、シフトJISでエンコードされているうえ、各データは「"」で囲まれ、行末には余分な改行コード「\r」が付いている。以下のとおりコマンドを実行し、UTF-8エンコードかつ不要な記号を取り除いた「POSTNUM.csv」を作成しよう。ちなみに、ファイルメーカーの個人向けデータベース「Bento」で利用する場合には、1行目だけ実行すればOKだ。
$ 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」テーブルが完成する。
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
);
$ sqlite3 POST.db < maketable.sql
次はいよいよCSVファイルの流し込み。以下のとおりコマンドを実行し、インポートを完了しよう。なお、「-separator」オプションは、あとに続く文字(,)を区切り記号として使用するという意味。2番目の引数はsqlite3の内部コマンドで、ファイル(POSTNUM.csv)をテーブル(POSTNUM)にインポートするという意味だ。
$ sqlite3 -separator , POST.db ".import POSTNUM.csv POSTNUM"
これで、郵便番号DBは一応完成。インデックスの作成など手順をいくつか省略しているが、データ検索には十分活用できる。まずは以下のコマンドを実行してみよう。日本郵政から入手したデータが全国版の場合、マイコミジャーナル編集部のある千代田区一ツ橋のデータが表示されればOKだ。
$ sqlite3 POST.db "select * from POSTNUM where no3='1000003';"
| リンクス、5600DPIのレーザーセンサーを搭載した8ボタンゲーミングマウス [16:51 2/10] |
| アスク、USBトークンキーをセキュリティキーとしたポータブルHDD2モデル [16:50 2/10] |
| 【特別企画】2012年 VAIO春モデルカスタマイズポイント ~VAIO Z編~ [15:44 2/10] |
| より多くのファイルをプレビュー表示できる「FenrirFS 2.3」が公開 [15:00 2/10] |
| ストーム、省スペースPCにLinux搭載の「Storm Book Tower LS Linux Edition」 [14:59 2/10] |
|
竹達彩奈、デビューシングル「Sinfonia! Sinfonia!!!」を4/11にリリース [17:02 2/10] ホビー |
|
一緒に住むのをためらってしまう相手のクセとは? [17:00 2/10] キャリア |
|
日産、スカイラインクーペ特別仕様車「55th Limited」を55台限定発売 [16:54 2/10] ライフ |
|
Behringer、「XENYX iX」シリーズにiPad用Dock搭載の3モデルを追加 [16:51 2/10] クリエイティブ |
|
リンクス、5600DPIのレーザーセンサーを搭載した8ボタンゲーミングマウス [16:51 2/10] パソコン |