トップページ 本棚 メモ帳 告知板 道具箱 サイトの表示設定 リンク集 Twitter

sqlite3でテキストファイルをインポート

Tags:

SQLiteでタブ区切りのテキストファイル(*1)を読み込んでテーブルを作る際は、以下のようなコマンドをコピーしてコマンドプロンプトにペーストすると一発で作業が終わる。

.\sqlite3.exe
.separator "\t"
.import storyData.txt storyData
.import characterData.txt characterData
.import titleData.txt titleData
.save novel.sqlite
.exit

コマンドの意味は以下の通り。

.separator "\t"
データの区切りとしてTABを使用することを宣言している。カンマなら.separator ","と書けばよい。
.import <ファイル名> <テーブル名>
テキストファイルを読み込んでテーブルへインポートする。既にデータがある場合はレコードがinsertされる。
.save <ファイル名>
データベースをファイルに保存している。拡張子は「.sqlite」としているがこれは任意。

注意点として、.importで読み込まれたデータはすべてTEXT型として扱われる点。他の型としてデータを使いたい場合、

  1. あらかじめ型付きでテーブルを作っておく
  2. 取り出し時にcastする

などの対応が必要になる。なお、SQLiteは列定義の変更や削除ができない(*2)(*3)ので、.importでデータを流し込んでから定義の変更、という手は取れない。

テーブルが存在しない場合先頭行がそのまま列名になるが、テーブルが存在する場合も特に無視されることなくデータとして取り込まれる。SQLite自体には先頭行をカットするようなコマンドやオプションは無いので、1行目に列名が付いているファイルを取り込む際は事前に当該レコードを削除しておくことが望ましい。

SQLite3でのCSVファイルのインポートにはもっと詳細な情報が載っている(*4)。

2019-04-23 追記

上記の処理をバッチファイル化する方法が分かったので記載する。sqlite3.exeを環境変数PATHの通ったフォルダへ置いておくことと、同じフォルダにすべてのファイルが揃っていることが前提。

import_cmd.txt

.separator "\t"
.import storyData.txt storyData
.import characterData.txt characterData
.import titleData.txt titleData
.save novel.sqlite
.exit

makedb.bat

sqlite3 < import_cmd.txt

あとはmakedb.batを実行すれば、フォルダにnovel.sqliteが生成される。

2019-04-24 追記

続編としてテーブルの内容をテキストファイルにエクスポートする方法も書いた。

*1:タブ区切りを前提にしているのは、Excelからシートをテキストファイルにコピーアンドペーストするようなケースを想定しているため。
*2:少なくとも2019-02-25リリースの3.27.2ではALTER TABLE <テーブル名> CHANGE...による列定義の操作はサポートされていない。今後どこかでサポートが追加される余地も無くはないが。
*3:tempなりworkなりの名前で望みの定義を持つテーブルを作り、データを全件SELECT-INSERTした後元のテーブルをDROPし、最後にtempなりworkなりだったテーブル名を元の名前に戻す(※これはSQLiteのALTER TABLE文でもサポートされている)……という手もあるが、それはデータの移行であって列定義の変更とは呼べまい。
*4:リンク先は.csvファイルが前提になっているが、単にseparatorの違いでしかないのでほぼすべての情報がそのまま適用できる。