データをファイルからインポート
コマンドラインツールを使うことでテーブルを作成したりテーブルにデータを挿入することができますが、多くのデータを挿入したい場合や既にあるデータをテーブルに挿入したい場合には外部のファイルにデータを作成しておきテーブルにインポートできると便利です。
SQLiteでは「.import」コマンドを使って別途用意したファイルからデータを読み込むことができます。使い方は次の通りです。
.import FILE TABLE
1番目の引数にはデータを記述したファイル名を指定し、2番目に引数にインポートするテーブル名を指定します。
例えば「data.txt」というファイルに記載したデータを「uriage」テーブルにインポートする場合は次のようにコマンドを実行します。
.import data.txt uriage
データの区切り文字
ではもう少し具体的に確認していきます。まずデータをインポートするテーブルを次のように用意しました。
テーブルには2つのカラムがあります。では今度はデータを記述するファイルを作成します。
10|掃除機 11|時計 12|テレビ
ファイルには1つのデータを1行に記述します。そして1行毎にカラムに格納する値を順に記載していきます。
テーブルに複数のカラムが含まれている場合は複数の値を1行に記載することになりますが、値と値の間には区切り文字を記述します。デフォルトの区切り文字は「|」となっていますが、現在設定されている区切り文字は「.show」コマンドで確認できます。
表示された値の中で「separator: "|"」と表示されている部分が現在の区切り文字となっています。区切り文字はSELECT文を使ってデータを取得し表示する時にも使用されますが、今回のようにデータをインポートする時の行の中にある値と値を区別する時にも使用されます。
区切り文字は「.separator」コマンドを使用して変更することができます。例えば区切り文字を「,」にしてみます。
.separator ,
もしデータが記述されているファイルの区切り文字が次のようにカンマ(,)が使用されている場合は、データをインポートする前に区切り文字をカンマ(,)に変更しておいて下さい。
10,掃除機 11,時計 12,テレビ
データの記述
テーブルに含まれているカラムが2つだった場合、インポートするデータは1行毎にカラムの数だけの値を記載する必要があります。例えば先ほどのテーブルを例に次のようなデータをインポートしてみます。
10,掃除機 11 12,テレビ
ファイルの2行目には値が1つしかありません。その為、「expected 2 columns of data but found 1」というエラーメッセージが表示されデータのインポートが失敗します。
データを追加する時に値を指定しないカラムに関しては値を記述しなくても構いませんが、値を省略する場合でも区切り文字は記載して下さい。例えば2行目のデータで2つ目のカラムの値を省略する場合は次のように記述します。
10,掃除機 11, 12,テレビ
また1つ目のカラムの値を省略する場合は次のように記述します。
10,掃除機 ,時計 12,テレビ
サンプル
では実際に試してみます。次のようなファイルを用意します。
10,掃除機 11,時計 12,テレビ
テーブルを作成し、事前にデータをいくつか追加します。
ではファイルからデータをインポートします。
このようにインポートしたデータはテーブルに追加されます。
読み込むデータのデータ型
データをインポートする場合、全てのデータはTEXT型の値として扱われます。その為、インポートするテーブルのカラムにデータ型が設定されていなかった場合、全てのデータはTEXT型の値として格納されます。
例えば次のようなデータをデータ型を指定してないカラムが含まれるテーブルにインポートしてみます。
10,掃除機 11,時計 12,テレビ
格納された値のデータ型を確認します。
このように全ての値はTEXT型の値としてインポートされています。つまり次のようなSQL文を実行した場合と同じです。
insert into test values('10', '掃除機');
insert into test values('11', '時計');
insert into test values('12', 'テレビ');
ただ、カラムにデータ型が指定してあった場合、TEXT型の値を追加した時点で変換が可能であればデータ型を変換してくれます。(データ変換がどのように行われるのかについて詳しくは「SQLiteで利用可能なデータ型」を参照して下さい)。
ではカラムにデータ型を指定してテーブルを作成し、そのテーブルに先ほどと同じデータをインポートしてみます。
格納された値のデータ型を確認します。
このように変換が可能であればカラムのデータ型に値を変換した上で値が格納されます。
なおインポートするデータを間違って次のように記述しないように気をつけて下さい。
10,'掃除機' 11,'時計' 12,'テレビ'
このように記述してしまうと、文字列の中に文字としてのシングルクォーテーション(')が含まれる値として処理されてしまいます。つまり上記はようなSQL文を実行した場合と同じです。
insert into test values('10', '''掃除機''');
insert into test values('11', '''時計''');
insert into test values('12', '''テレビ''');