CSV'den SQL'e Dönüştürücü
CSV verilerinden SQL INSERT sorguları oluşturun
CSV Girişi
SQL Çıktısı
CSV'den SQL'e Dönüşüm Nedir?
CSV'den SQL'e dönüşüm, virgülle ayrılmış değerleri ilişkisel bir veritabanının çalıştırabileceği Structured Query Language sorgularına dönüştürür. En yaygın çıktı bir çiftten oluşur: sütunları tanımlayan bir CREATE TABLE sorgusu ve CSV dosyasındaki satırlarla bu sütunları dolduran bir veya daha fazla INSERT INTO sorgusu.
CSV dosyaları RFC 4180 belirtimini izler. Her satır bir kayıttır, alanlar bir ayırıcıyla (genellikle virgül) birbirinden ayrılır ve ayırıcı ya da yeni satır içeren alanlar çift tırnak içine alınır. SQL ise PostgreSQL, MySQL, SQLite ve SQL Server gibi sistemlerde verileri yönetmek için kullanılan standart dildir. Bu iki biçim arasındaki dönüşüm, yazılım geliştirmede en sık karşılaşılan veri içe aktarma görevlerinden biridir.
İyi bir CSV-to-SQL dönüştürücüsü tırnak işlemlerini yönetir, değerlerin içindeki tek tırnakları SQL standardına göre iki katına çıkararak '' biçimine dönüştürür, sütun başlıklarını geçerli SQL tanımlayıcılarıyla eşler ve isteğe bağlı olarak veri türlerini çıkarabilir. Temel kaçış işlemlerinin ötesinde, iyi bir dönüştürücü başlık adlarını normalleştirir (boşlukları ve kısa çizgileri alt çizgiyle değiştirir) ve çıktıyı bir işlem bloğuna sarar; böylece içe aktarma başarısız olursa tabloda kısmi veri bırakmak yerine temiz bir geri alma gerçekleşir. Dönüştürücü olmadan birkaç yüz satır için bile INSERT sorgularını elle yazmak hem hataya açıktır hem de yavaştır.
Neden CSV'den SQL'e Dönüştürücü Kullanmalısınız?
Elektronik tablo verilerinden SQL INSERT sorgularını elle yazmak yorucu bir iştir ve sözdizimi hatalarına davetiye çıkarır. Bir dönüştürücü tekrar eden kısımları otomatikleştirir; böylece şema tasarımına ve veri doğrulamaya odaklanabilirsiniz.
CSV'den SQL'e Dönüştürme Kullanım Senaryoları
SQL Veri Türleri Başvurusu
CSV'yi SQL'e dönüştürürken CSV'nin tür meta verisi olmadığından her sütun varsayılan olarak TEXT türüne ayarlanır. Sütun türlerini biliyorsanız, CREATE TABLE çıktısındaki TEXT değerlerini değiştirebilirsiniz. Bu tablo en yaygın SQL türlerini ve her birinin ne zaman kullanılacağını gösterir.
| Tür | Kullanım Alanı | Notlar |
|---|---|---|
| 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 |
SQL Diyalekti Karşılaştırması
SQL sözdizimi veritabanı motorları arasında farklılık gösterir. Oluşturulan INSERT sorguları çoğu sistemde çalışan standart SQL kullanır; ancak bazı özellikler farklıdır. Bu tablo, CSV verisi içe aktarırken en önemli farkları özetler.
| Özellik | 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 ve COPY: İçe Aktarma Yöntemi Seçimi
Küçük ve orta büyüklükteki veri kümeleri için (10.000 satırın altında) INSERT sorguları iyi çalışır ve her SQL veritabanında taşınabilirdir. Büyük içe aktarmalar için veritabanları, SQL ayrıştırıcısını tamamen atlayan toplu yükleme komutları sağlar.
Kod Örnekleri
Bu örnekler, farklı dillerde CSV'yi SQL INSERT sorgularına nasıl dönüştüreceğinizi gösterir. Her biri tek tırnak kaçırma ve sütun adı temizleme işlemlerini kapsar.
// 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;"