このエントリーをはてなブックマークに追加


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を行いました。

  • 作成したテーブル
    CREATE TABLE t1 (
     ID,
     NAME,
     CODE
    );
  • 準備したcsvファイル
    filecc.csv (改行コードLF)
    1,"Bitcoin","BTC"
    2,"Ethereum","ETH"
    3,"Bitcoin Cash","BCH"
    4,"Litecoin","LTC"
    5,"Shield","XSH"

csvファイルを投入する

以下の操作により、csvファイルをインポートすることができます。

  1. 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> 
  2. csv投入用のテーブルを作成する
    CREATE TABLE t1 (
      ID,
      NAME,
      CODE
    );
    以下、実行時の出力です。
    sqlite> CREATE TABLE t1 (
       ...>   ID,
       ...>   NAME,
       ...>   CODE
       ...> );
    sqlite> 
  3. セパレータ文字列を確認する
    .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がパイプ|になっています。
    これをカンマ(,)に変更します。
  4. colseparatorをカンマに変更する
    .separator ,
    以下、実行時の出力です。
    sqlite> .separator ,
    sqlite> 
  5. 変更されたか確認します
    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,に変更されているのが確認できます。
  6. csvファイルを投入します
    .import ファイル名 テーブル名
    以下、実行時の出力です。
    sqlite> .import ./cc.csv t1
    sqlite> 
  7. 実際にインポートされたか確認します
    sqlite> SELECT * FROM t1;
    1,Bitcoin,BTC
    2,Ethereum,ETH
    3,Bitcoin Cash,BCH
    4,Litecoin,LTC
    5,Shield,XSH
    sqlite> 
  8. 投入されたことが確認できましたが、セパレータをカンマ(,)に変更したため、パイプ(|)に戻し、再度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が投入されているのが確認できました。
  9. sqlite3を終了します。
    sqlite> .quit

コマンドラインから直接投入する方法

コマンドラインからSQLiteにcsvファイルの内容をインポートする手順を以下に記します。

  1. データベースとテーブルを作成します
    sakura@debian:~$ sqlite3 direct.sqlite3 "CREATE TABLE t1 (ID, NAME, CODE);"
  2. -separatorにカンマ(,)を指定し、.importでcsvファイルを取り込みます
    sakura@debian:~$ sqlite3 direct.sqlite3 -separator , ".import ./cc.csv t1"
  3. 取り込みされているかの確認です
    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をインポートする操作例でした。


添付ファイル: filecc.csv 714件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-06-18 (月) 23:51:45