CSV to SQL
Hasilkan pernyataan SQL INSERT dari data CSV
Input CSV
Output SQL
Apa itu Konversi CSV ke SQL?
Konversi CSV ke SQL mengubah nilai yang dipisahkan koma menjadi pernyataan Structured Query Language yang dapat dieksekusi oleh basis data relasional. Output paling umum berupa pasangan: pernyataan CREATE TABLE yang mendefinisikan kolom, dan satu atau lebih pernyataan INSERT INTO yang mengisi kolom tersebut dengan baris dari file CSV.
File CSV mengikuti spesifikasi RFC 4180. Setiap baris adalah satu record, kolom dipisahkan oleh pembatas (biasanya koma), dan kolom yang mengandung pembatas atau baris baru dibungkus dengan tanda kutip ganda. SQL, di sisi lain, adalah bahasa standar untuk mengelola data di sistem seperti PostgreSQL, MySQL, SQLite, dan SQL Server. Konversi antara kedua format ini adalah salah satu tugas impor data yang paling sering dilakukan dalam pengembangan perangkat lunak.
Konverter CSV-ke-SQL yang baik menangani pengapitan, meng-escape tanda kutip tunggal di dalam nilai (menggandakannya menjadi '' sesuai standar SQL), memetakan header kolom ke pengenal SQL yang valid, dan dapat menyimpulkan tipe data secara opsional. Selain escaping dasar, konverter yang baik menormalkan nama header (mengganti spasi dan tanda hubung dengan garis bawah) dan membungkus output dalam blok transaksi, sehingga kegagalan impor dapat dibatalkan dengan bersih tanpa meninggalkan data parsial di tabel. Tanpa konverter, menulis pernyataan INSERT secara manual bahkan untuk beberapa ratus baris saja sangat rentan kesalahan dan lambat.
Mengapa Menggunakan Konverter CSV ke SQL?
Menulis pernyataan SQL INSERT secara manual dari data spreadsheet membosankan dan rawan kesalahan sintaks. Konverter mengotomasi bagian yang berulang sehingga Anda bisa fokus pada desain skema dan validasi data.
Kasus Penggunaan CSV ke SQL
Referensi Tipe Data SQL
Saat mengonversi CSV ke SQL, setiap kolom menggunakan TEXT sebagai default karena CSV tidak memiliki metadata tipe. Jika Anda mengetahui tipe kolom, Anda dapat mengganti TEXT pada output CREATE TABLE. Tabel ini menampilkan tipe SQL yang paling umum dan kapan menggunakannya.
| Tipe | Digunakan Untuk | Catatan |
|---|---|---|
| TEXT / VARCHAR | Strings, mixed content | Default safe choice; works in every SQL dialect |
| INTEGER / INT | Whole numbers (age, count, ID) | Use when column contains only digits with no decimals |
| REAL / FLOAT | Decimal numbers (price, rate) | Needed for columns with dots like 19.99 or 3.14 |
| DATE | ISO 8601 dates (2024-01-15) | Requires consistent formatting; varies by database |
| BOOLEAN | true/false, 1/0, yes/no | MySQL uses TINYINT(1); PostgreSQL has native BOOL |
| NUMERIC / DECIMAL | Exact precision (currency) | Specify scale: DECIMAL(10,2) for money columns |
| BLOB / BYTEA | Binary data | Rarely needed in CSV imports; use for hex-encoded fields |
Perbandingan Dialek SQL
Sintaks SQL bervariasi antar mesin basis data. Pernyataan INSERT yang dihasilkan menggunakan SQL standar yang berlaku di sebagian besar sistem, namun fitur tertentu berbeda. Tabel ini merangkum perbedaan yang paling penting saat mengimpor data CSV.
| Fitur | PostgreSQL | MySQL | SQLite | SQL Server |
|---|---|---|---|---|
| Identifier quoting | "col" | `col` | "col" | [col] |
| String escape | '' | '' or \' | '' | '' |
| INSERT syntax | INSERT INTO | INSERT INTO | INSERT INTO | INSERT INTO |
| Batch INSERT | VALUES (),()โฆ | VALUES (),()โฆ | VALUES (),()โฆ | max 1000 rows |
| Auto-increment | SERIAL | AUTO_INCREMENT | AUTOINCREMENT | IDENTITY(1,1) |
| Upsert / merge | ON CONFLICT | ON DUPLICATE KEY | ON CONFLICT | MERGE |
| NULL handling | IS NULL | IS NULL / <=> | IS NULL | IS NULL |
| COPY from CSV | COPY โฆ FROM | LOAD DATA INFILE | .import | BULK INSERT |
INSERT vs COPY: Memilih Metode Impor
Untuk dataset kecil hingga menengah (di bawah 10.000 baris), pernyataan INSERT bekerja dengan baik dan portabel di semua basis data SQL. Untuk impor besar, basis data menyediakan perintah pemuatan massal yang melewati parser SQL sepenuhnya.
Contoh Kode
Contoh-contoh ini menunjukkan cara mengonversi CSV ke pernyataan SQL INSERT dalam berbagai bahasa. Masing-masing menangani escaping tanda kutip tunggal dan sanitasi nama kolom.
// CSV โ SQL INSERT statements
const csv = `name,age,city
Alice,30,Berlin
Bob,25,Tokyo`
function csvToSql(csv, table = 'data') {
const rows = csv.trim().split('\n').map(r => r.split(','))
const [headers, ...data] = rows
const cols = headers.map(h => h.trim().toLowerCase().replace(/\s+/g, '_'))
const values = data.map(row =>
' (' + row.map(v => `'${v.replace(/'/g, "''").trim()}'`).join(', ') + ')'
)
return `INSERT INTO ${table} (${cols.join(', ')}) VALUES
${values.join(',\n')};`
}
console.log(csvToSql(csv, 'users'))
// โ INSERT INTO users (name, age, city) VALUES
// ('Alice', '30', 'Berlin'),
// ('Bob', '25', 'Tokyo');import csv
import io
csv_string = """name,age,city
Alice,30,Berlin
Bob,25,Tokyo"""
reader = csv.reader(io.StringIO(csv_string))
headers = [h.strip().lower().replace(' ', '_') for h in next(reader)]
table = 'users'
rows = list(reader)
# CREATE TABLE
col_defs = ', '.join(f'{h} TEXT' for h in headers)
print(f'CREATE TABLE {table} ({col_defs});')
# โ CREATE TABLE users (name TEXT, age TEXT, city TEXT);
# INSERT statements
for row in rows:
vals = ', '.join(f"'{v.replace(chr(39), chr(39)*2)}'" for v in row)
print(f"INSERT INTO {table} ({', '.join(headers)}) VALUES ({vals});")
# โ INSERT INTO users (name, age, city) VALUES ('Alice', '30', 'Berlin');
# โ INSERT INTO users (name, age, city) VALUES ('Bob', '25', 'Tokyo');package main
import (
"encoding/csv"
"fmt"
"strings"
)
func csvToSQL(data, table string) string {
r := csv.NewReader(strings.NewReader(data))
records, _ := r.ReadAll()
if len(records) < 2 {
return ""
}
headers := records[0]
var vals []string
for _, row := range records[1:] {
escaped := make([]string, len(row))
for i, v := range row {
escaped[i] = "'" + strings.ReplaceAll(v, "'", "''") + "'"
}
vals = append(vals, " ("+strings.Join(escaped, ", ")+")")
}
return fmt.Sprintf("INSERT INTO %s (%s) VALUES\n%s;",
table, strings.Join(headers, ", "), strings.Join(vals, ",\n"))
}
func main() {
csv := "name,age,city\nAlice,30,Berlin\nBob,25,Tokyo"
fmt.Println(csvToSQL(csv, "users"))
// โ INSERT INTO users (name, age, city) VALUES
// ('Alice', '30', 'Berlin'),
// ('Bob', '25', 'Tokyo');
}# SQLite: import CSV directly into a table sqlite3 mydb.db <<EOF .mode csv .import data.csv users SELECT * FROM users LIMIT 5; EOF # PostgreSQL: COPY from CSV file (server-side) psql -c "COPY users FROM '/path/to/data.csv' WITH (FORMAT csv, HEADER true);" # PostgreSQL: \copy from CSV (client-side, no superuser needed) psql -c "\copy users FROM 'data.csv' WITH (FORMAT csv, HEADER true);" # MySQL: LOAD DATA from CSV mysql -e "LOAD DATA INFILE '/path/to/data.csv' INTO TABLE users FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS;"