Menu

Impor CSV ke SQLite: Memuat Data dengan .import dan --csv

Cara mengimpor file CSV ke SQLite memakai perintah .import: menangani header, tabel yang sudah ada, pemisah khusus, dan error yang paling umum.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

Impor CSV Ada di CLI, Bukan di SQL

Tidak ada pernyataan IMPORT di dialek SQL SQLite. Memuat CSV adalah fitur dari command-line shell sqlite3, berupa dot command bernama .import. Ini pergeseran cara berpikir yang penting kalau kamu terbiasa dengan LOAD DATA INFILE di MySQL atau COPY di Postgres: keduanya berjalan di server, sedangkan .import adalah sesuatu yang dikerjakan tool client untukmu, dengan membaca file lalu menjalankan pernyataan INSERT di balik layar.

Jadi, semua yang ada di halaman ini mengasumsikan kamu berada di dalam shell sqlite3:

sqlite3 mydata.db

Kalau kamu perlu mengimpor dari kode aplikasi, misalnya Python, Node, atau Go, kamu akan membaca CSV di bahasa itu lalu memakai pernyataan INSERT dengan parameter. Kita akan membahas cara itu di bab integrasi aplikasi. Di sini, fokusnya adalah CLI.

.import Dasar

Jalan terpendek: beri tahu SQLite bahwa file-nya CSV, lalu arahkan .import ke file itu dan sebuah nama tabel.

.mode csv
.import people.csv people

Ada dua kemungkinan, tergantung apakah people sudah ada:

  • Tabel belum ada: SQLite membuatnya, memakai baris pertama CSV sebagai nama kolom. Setiap kolom mendapat affinity TEXT.
  • Tabel sudah ada: SQLite memasukkan setiap baris file sebagai data. Baris header, kalau ada, ikut menjadi sebuah baris.

Kasus kedua itulah yang paling sering menjebak orang di percobaan pertama. Kalau CSV-mu punya header dan tabelnya sudah ada, kamu perlu melewati header itu secara eksplisit.

Melewati Header pada Tabel yang Sudah Ada

Pakai --skip 1 untuk menyuruh .import mengabaikan N baris pertama:

CREATE TABLE people (
    name TEXT,
    age  INTEGER,
    city TEXT
);

.import --csv --skip 1 people.csv people

--csv adalah singkatan dari .mode csv yang hanya berlaku untuk perintah ini, jadi kamu tidak perlu mengatur mode secara terpisah. --skip 1 membuang header-nya. Baris-baris sisanya dimasukkan ke people sesuai urutan kolom.

Pengecekan cepat setelah impor:

SELECT count(*) FROM people;
SELECT * FROM people LIMIT 5;

Urutan kolom di file harus sama dengan urutan kolom di tabel. Tidak ada pemetaan berdasarkan header: .import hanya menjajarkan field ke-N dengan kolom ke-N.

Membiarkan SQLite Membuat Tabelnya

Untuk pekerjaan eksplorasi, cara termudah adalah melewati CREATE TABLE sepenuhnya dan membiarkan .import membangun tabel dari header:

.mode csv
.import sales.csv sales

.schema sales

.schema sales akan menampilkan sesuatu seperti:

CREATE TABLE sales(
  "order_id" TEXT,
  "amount" TEXT,
  "ordered_at" TEXT
);

Perhatikan bahwa setiap kolom bertipe TEXT. Itu disengaja: .import tidak mencoba menebak tipe. Kalau kamu ingin amount sebagai bilangan real dan ordered_at sebagai timestamp yang benar, buat tabelnya sendiri lebih dulu dengan tipe yang tepat, lalu impor dengan --skip 1. Type affinity di SQLite akan mengubah string angka menjadi integer dan real saat insert.

Pemisah Khusus: TSV, Pipe, Titik Koma

.mode csv memakai koma. Untuk file yang dipisahkan tab, ganti mode-nya:

.mode tabs
.import data.tsv events

Untuk pemisah lain, pakai .separator setelah memilih mode:

.mode csv
.separator "|"
.import pipe_data.txt events

Satu hal yang perlu diketahui: .mode csv mengikuti aturan tanda kutip RFC 4180, jadi field yang mengandung koma atau baris baru tetap aman selama diberi tanda kutip " dengan benar. .mode tabs adalah mode yang lebih sederhana, yang hanya memisahkan berdasarkan karakter tanpa aturan tanda kutip. Kalau file-mu punya field bertanda kutip yang mengandung pemisah, tetaplah di .mode csv dan ganti pemisahnya.

Contoh Langkah demi Langkah

Misalnya orders.csv seperti ini:

order_id,customer,amount,ordered_at
1001,Ada,49.99,2026-01-12
1002,Boris,12.50,2026-01-13
1003,"Chen, Wei",199.00,2026-01-14

Perhatikan bahwa baris ke-3 punya koma di dalam field yang diberi tanda kutip. Berikut sesi lengkapnya:

Di shell sungguhan, blok INSERT itu akan diganti dengan satu perintah .import --csv --skip 1 orders.csv orders. Field "Chen, Wei" tetap utuh karena mode CSV menghormati tanda kutipnya. amount menjadi bilangan real dan order_id menjadi integer berkat tipe kolomnya.

Membungkus Impor dalam Transaksi

.import menjalankan satu INSERT per baris. Untuk beberapa ribu baris, itu tidak masalah. Untuk sejuta baris, prosesnya sangat lambat, kecuali kamu membungkus semuanya dalam transaksi agar SQLite tidak melakukan commit setelah setiap baris:

BEGIN;
.import --csv --skip 1 big_file.csv events
COMMIT;

Satu perubahan ini bisa mengubah impor yang butuh beberapa menit menjadi hanya beberapa detik. Kalau ada yang gagal di tengah impor, ROLLBACK membatalkan data yang sudah sebagian masuk, dan itu juga praktis untuk mencoba ulang.

Kamu bisa mempercepatnya lagi dengan membuang index sebelum impor lalu membuatnya ulang setelahnya, karena pemeliharaan index untuk setiap baris lama-lama terasa.

Error yang Umum dan Cara Memperbaikinya

Error: expected N columns but found M: jumlah field di sebuah baris tidak sesuai dengan tabel. Biasanya karena:

  • Ada koma nyasar di field tanpa tanda kutip. Ekspor ulang dengan tanda kutip CSV yang benar, atau ganti ke .mode csv (RFC 4180), bukan .mode tabs.
  • Ada baris kosong di akhir file. Edit file-nya atau manfaatkan --skip dengan cerdik.
  • Tabel punya lebih banyak kolom daripada CSV. Tambahkan kolom yang hilang ke file, atau masukkan ke tabel penampung dengan bentuk yang sesuai lalu salin ke tabel sebenarnya.

Baris header muncul sebagai data: kamu lupa --skip 1 pada tabel yang sudah ada. Hapus baris itu (DELETE FROM t WHERE rowid = 1) lalu jalankan ulang dengan flag tersebut.

Angka tersimpan sebagai string: kamu membiarkan .import membuat tabelnya, jadi setiap kolom bertipe TEXT. Buang tabelnya, definisikan secara eksplisit dengan kolom INTEGER/REAL, lalu impor ulang.

Error: no such file: path-nya dihitung relatif terhadap tempat kamu menjalankan sqlite3, bukan terhadap file database. Pakai path absolut atau cd ke direktori yang benar sebelum membuka shell.

CLI mencetak nomor baris saat terjadi error, dan itu cara tercepat menemukan baris yang bermasalah di file besar.

Rangkuman Singkat

  • .import adalah dot command CLI, bukan SQL. Jalankan di dalam shell sqlite3.
  • Pakai --csv untuk menangani tanda kutip dengan benar, dan --skip 1 untuk mengabaikan baris header.
  • Kalau tabelnya belum ada, .import membuatnya dari header, tapi setiap kolom akan bertipe TEXT. Buat tabelnya sendiri untuk mendapatkan tipe yang benar.
  • Bungkus impor besar dalam BEGIN/COMMIT agar tidak terjadi satu transaksi per baris.
  • Urutan kolom di file harus sama dengan urutan kolom di tabel.

Berikutnya: Mengekspor Data Kembali

Impor baru separuh cerita. Shell yang sama bisa membuat dump hasil query atau seluruh tabel kembali ke CSV, JSON, atau SQL. Berguna untuk backup, pipeline data, dan menyerahkan data ke tool lain. Itu dibahas di halaman ekspor data.

Pertanyaan yang sering diajukan

Bagaimana cara mengimpor file CSV ke SQLite?

Buka database dengan CLI sqlite3, pindah ke mode CSV dengan .mode csv, lalu jalankan .import data.csv table_name. Kalau tabelnya belum ada, SQLite membuatnya dengan memakai baris pertama file sebagai nama kolom. Kalau tabelnya sudah ada, setiap baris file dimasukkan sebagai data, jadi biasanya kamu perlu .import --skip 1 untuk melewati header.

Bagaimana cara mengimpor CSV yang punya baris header ke tabel SQLite yang sudah ada?

Pakai .import --csv --skip 1 data.csv table_name. Flag --skip 1 menyuruh SQLite mengabaikan baris pertama agar baris header tidak menjadi baris data. Tanpanya, kamu akan mendapat satu baris berisi nama-nama kolom itu sendiri.

Kenapa impor CSV ke SQLite gagal dengan 'expected N columns but found M'?

File-nya punya baris dengan jumlah kolom yang berbeda dari tabel, biasanya karena ada koma di dalam field, tanda kutip yang tidak di-escape, atau baris kosong di akhir file. Pakai .mode csv (atau --csv), bukan .mode tabs, agar SQLite menangani tanda kutip sesuai RFC 4180, dan periksa file-nya dengan text editor untuk mencari pemisah yang nyasar. CLI mencetak nomor baris yang bermasalah, dan itu cara tercepat menemukan baris yang rusak.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai