概要
コマンドラインツールを使ってSQLiteのデータベースにCSVファイルのデータをインポート/エクスポートする方法。
自作のスクリプトでテキストを読込/出力したりDBに接続してinsert/selectをやるよりはるかに簡単。
CSVのフォーマットについて
CSVはRFCでフォーマットが定義されている。
RFCにはダブルクォートの取り扱いや改行コードなどについて記載されているので、一度は目を通しておくべき。
アプリケーションによって、対応していなかったり拡張されていたりするのでややこしい。
-
Common Format and MIME Type for Comma-Separated Values (CSV) Files
https://tools.ietf.org/html/rfc4180 -
(日本語訳)
http://www.kasai.fm/wiki/rfc4180jp
環境
- Windows 10 64bit
- SQLite3 (3.36.0) Command-Line Shell
CSVファイルを取り込む
CSVファイルをインポートするに当たっては以下のことに注意する。
- CSVファイルは上記RFCに従って記述しておくのがベスト
- インポート先として指定した名前のテーブルが存在しているかどうかで挙動が異なる。
既にテーブルがある |
|
テーブルがない |
|
実行例
-
sample.csvファイルをsample_tableとして取り込む。
「--csv」オプションでCSVのフォーマットを認識してくれる。 -
「--skip 1」オプションでsample.csvファイルの1行目を無視する。
ファイルにヘッダが含まれていて取り込まれたくない場合に使用する。 -
「-v」オプションで取り込みの詳細が出力される。
下記の場合、CSVファイルからの入力が5行で、 新規挿入された行が4行、エラーは0件 と表示されている。
sqlite> -- # 1.
sqlite> .import sample.csv sample_table --csv
sqlite> -- # 2.
sqlite> .import sample.csv sample_table --csv --skip 1
sqlite> -- # 3.
sqlite> .import sample.csv sample_table --csv --skip 1 -v
Added 4 rows with 0 errors using 5 lines of input
「.import」コマンドのオプションが使えるのはver 3.32.0から
SQLite ver 3.32.0未満の環境でCSVデータを取り込む場合は、以下参照のこと。
CSVファイルを書き出す
手順は以下の実行例を参照のこと。 SQLiteコマンドラインツールのCSVをエクスポート機能には、以下の特徴がある。
- RFCに従ってエスケープ処理をやってくれる。
- 出力先に同名のファイルが存在していても、上書き確認はしてくれない。
-
「.mode csv」 を利用し「.separator ,」は利用しないこと。
「.separator ,」ではカンマやダブルクォーテーションがエスケープ処理されない。
実行例
- CSVモードに切り替え
- ヘッダ(カラム名)を一緒に出力する場合 「.headers on」にする
- 次に打ち込むコマンドの結果をresult.csvに出力
- 出力したいコマンドを実行する
sqlite> -- # 1.
sqlite> .mode CSV
sqlite> -- # 2.
sqlite> .headers on
sqlite> -- # 3.
sqlite> .once result.csv
sqlite> -- # 4.
sqlite> select * from sample_table;
参考URL
-
CSV Import
公式のCSVインポートに関するドキュメント
https://www.sqlite.org/cli.html#csv -
CSV Export
公式のCSVエクスポートに関するドキュメント
https://www.sqlite.org/cli.html#csvout
-
あさはか備忘録: SQLite3 TSVデータを取り込む、TSVデータを出力する
https://sfnovicenotes.blogspot.com/2019/10/sqlite3-tsvtsv.html