SQLiteでCSVを投入(インポート)する方法 †
SQLite3を使って、csvファイルをテーブルにインポートする操作例を以下に記します。
使用した環境 †
本資料の動作確認は以下の環境で行いました。
- OS
- Ubuntu 16.04.4 LTS
- Debian GNU/Linux 9.4 (stretch)
- SQLite3
- 3.11.0 2016-02-15 17:29:24 3d862f207e3adc00f78066799ac5a8c282430a5f
- 3.16.2 2017-01-06 16:32:41 a65a62893ca8319e89e48b8a38cf8a59c69a8209
インポートを行うための準備環境 †
CSVをSQLiteに投入するために、CSVファイルの準備とCREATE TABLEを行いました。
- 準備したcsvファイル
cc.csv (改行コードLF)
1,"Bitcoin","BTC"
2,"Ethereum","ETH"
3,"Bitcoin Cash","BCH"
4,"Litecoin","LTC"
5,"Shield","XSH"
csvファイルを投入する †
以下の操作により、csvファイルをインポートすることができます。
- csvをインポートするデータベースを作成
sqlite3 importdb.sqlite3
以下、実行時の出力です。
sakura@debian:~$ sqlite3 importdb.sqlite3
SQLite version 3.16.2 2017-01-06 16:32:41
Enter ".help" for usage hints.
sqlite>
- csv投入用のテーブルを作成する
CREATE TABLE t1 (
ID,
NAME,
CODE
);
以下、実行時の出力です。
sqlite> CREATE TABLE t1 (
...> ID,
...> NAME,
...> CODE
...> );
sqlite>
- セパレータ文字列を確認する
.show
以下、実行時の出力です。
sqlite> .show
echo: off
eqp: off
explain: auto
headers: off
mode: list
nullvalue: ""
output: stdout
colseparator: "|"
rowseparator: "\n"
stats: off
width:
filename: importdb.sqlite3
sqlite>
本出力にある、colseparatorがパイプ|になっています。
これをカンマ(,)に変更します。
- colseparatorをカンマに変更する
.separator ,
以下、実行時の出力です。
sqlite> .separator ,
sqlite>
- 変更されたか確認します
sqlite> .show
echo: off
eqp: off
explain: auto
headers: off
mode: list
nullvalue: ""
output: stdout
colseparator: ","
rowseparator: "\n"
stats: off
width:
filename: importdb.sqlite3
sqlite>
colseparatorが,に変更されているのが確認できます。
- csvファイルを投入します
.import ファイル名 テーブル名
以下、実行時の出力です。
sqlite> .import ./cc.csv t1
sqlite>
- 実際にインポートされたか確認します
sqlite> SELECT * FROM t1;
1,Bitcoin,BTC
2,Ethereum,ETH
3,Bitcoin Cash,BCH
4,Litecoin,LTC
5,Shield,XSH
sqlite>
- 投入されたことが確認できましたが、セパレータをカンマ(,)に変更したため、パイプ(|)に戻し、再度SELECTを発行してみます
sqlite> SELECT * FROM t1;
1|Bitcoin|BTC
2|Ethereum|ETH
3|Bitcoin Cash|BCH
4|Litecoin|LTC
5|Shield|XSH
sqlite> SELECT ID,CODE FROM t1;
1|BTC
2|ETH
3|BCH
4|LTC
5|XSH
csvが投入されているのが確認できました。
- sqlite3を終了します。
sqlite> .quit
コマンドラインから直接投入する方法 †
コマンドラインからSQLiteにcsvファイルの内容をインポートする手順を以下に記します。
- データベースとテーブルを作成します
sakura@debian:~$ sqlite3 direct.sqlite3 "CREATE TABLE t1 (ID, NAME, CODE);"
- -separatorにカンマ(,)を指定し、.importでcsvファイルを取り込みます
sakura@debian:~$ sqlite3 direct.sqlite3 -separator , ".import ./cc.csv t1"
- 取り込みされているかの確認です
sakura@debian:~$ sqlite3 direct.sqlite3 "select * from t1"
1|Bitcoin|BTC
2|Ethereum|ETH
3|Bitcoin Cash|BCH
4|Litecoin|LTC
5|Shield|XSH
.separatorについて †
.separatorについて確認すると、以下のようになっています。
$ man sqlite3
<省略>
.separator STRING ?NL? Change separator used by output mode and .import
NL is the end-of-line mark for CSV
<省略>
構文は以下のようになります。
.separator セパレータ文字列 改行
つまり、.showで表示されるcolseparatorとrowseparatorに対応します。
.separator colseparator rowseparator
以下、実際に行セパレータ(rowseparator)を設定した例になります。
- 変更前
sqlite> .show
echo: off
eqp: off
explain: auto
headers: off
mode: list
nullvalue: ""
output: stdout
colseparator: "|"
rowseparator: "\n"
stats: off
width:
filename: foo.sqlite3
- 変更後
sqlite> .separator , "\r\n"
sqlite> .show
echo: off
eqp: off
explain: auto
headers: off
mode: list
nullvalue: ""
output: stdout
colseparator: ","
rowseparator: "\r\n"
stats: off
width:
filename: foo.sqlite3
尚、引数を与えず、.separatorを実行すると、使用方法が表示されます。
sqlite> .separator
Usage: .separator COL ?ROW?
出力の通り、COLは必須ですが、ROWは任意です。
以上、SQLiteでCSVをインポートする操作例でした。