導入
データベース管理者にとって、外部システムから出力されたCSVファイルをテーブルへ取り込む作業は日常茶飯事です。一つひとつINSERT文を書くのは非効率かつミスの元となります。SQLiteの「.import」コマンドを使いこなすことで、大量のデータを正確かつ迅速にデータベースへ格納するスキルを身につけましょう。
基礎知識
SQLiteの「.import」コマンドは、指定したファイルからデータを読み込み、テーブルに流し込む機能です。重要なポイントは、実行前に「.mode csv」コマンドで読み込みモードを切り替えておく必要がある点です。これを行わないと、区切り文字が正しく認識されず、期待通りにインポートできません。
また、インポート先のテーブルが「存在している場合」と「存在していない場合」で挙動が大きく異なります。特に存在していない場合は、CSVのヘッダー行が自動的にカラム名として扱われる仕様になっているため、この挙動を把握しておくことが重要です。
実装/解決策
実務では、まず対象のCSVファイルがUTF-8でエンコードされていることを確認してください。Windows環境などで作成されたShift-JISのCSVの場合、日本語が文字化けする可能性があります。インポート作業は以下の手順で行います。
1. コマンドラインツールを起動し、対象のデータベースファイルを開く。
2. .mode csv コマンドを実行してCSV解析モードへ切り替える。
3. .import [ファイルパス] [テーブル名] を実行する。
サンプルプログラム
以下は、実務でよくある「CSVから新規テーブルを作成してインポートする」際の一連の流れです。
— 1. 作業環境をCSVモードに変更
.mode csv
— 2. カレントディレクトリにあるデータをインポート
— 存在しないテーブル名を指定すると、1行目がカラム名として自動生成されます
.import ./import_data.csv target_table
— 3. インポート結果を確認
.schema target_table
SELECT FROM target_table LIMIT 5;
— 4. インポート完了後、念のためモードをデフォルト(リスト形式)に戻すのが丁寧です
.mode list
応用・注意点
現場でよく陥る落とし穴として、「データ型」の制約が挙げられます。.importコマンドで自動作成されたテーブルのデータ型は、基本的にすべて「TEXT型」になります。
もし、インポート後に計算を行ったり、インデックスを貼って高速化したりしたい場合は、以下の手順を推奨します。
1. 一時的なテーブル(staging_table)にインポートする
2. インポート後、適切な型(INTEGERやREALなど)を指定した本番用テーブルを作成する
3. INSERT INTO 本番テーブル SELECT FROM staging_table でデータを流し込む
また、CSVにダブルクォーテーションが含まれている場合や、改行コードが混在している場合は、前処理としてsedコマンドやスクリプトで正規化しておくのが、後々のトラブルを防ぐDBAの鉄則です。

コメント