ToolDeck

CSV به SQL

تولید دستورات SQL INSERT از داده‌های CSV

یک مثال امتحان کنید

ورودی CSV

خروجی SQL

به‌صورت محلی اجرا می‌شود · جای‌گذاری اسرار امن است
SQL اینجا نمایش داده خواهد شد…
نام جدول:

تبدیل CSV به SQL چیست؟

تبدیل CSV به SQL، مقادیر جداشده با کاما را به دستورات زبان کوئری ساختاریافته (SQL) تبدیل می‌کند که یک پایگاه داده رابطه‌ای می‌تواند اجرا کند. رایج‌ترین خروجی یک جفت دستور است: یک دستور CREATE TABLE که ستون‌ها را تعریف می‌کند، و یک یا چند دستور INSERT INTO که آن ستون‌ها را با سطرهای فایل CSV پر می‌کنند.

فایل‌های CSV از مشخصات RFC 4180 پیروی می‌کنند. هر خط یک رکورد است، فیلدها با یک جداکننده (معمولاً کاما) از هم جدا می‌شوند، و فیلدهایی که شامل جداکننده یا سطر جدید هستند در گیومه دوتایی محصور می‌شوند. SQL، از سوی دیگر، زبان استاندارد برای مدیریت داده در سیستم‌هایی مانند PostgreSQL، MySQL، SQLite و SQL Server است. تبدیل بین این دو فرمت یکی از متداول‌ترین وظایف وارد کردن داده در توسعه نرم‌افزار است.

یک مبدل صحیح CSV به SQL از نقل‌قول‌گذاری پشتیبانی می‌کند، نقل‌قول‌های تکی داخل مقادیر را escape می‌کند (با دوبرابر کردن آن‌ها به '' طبق استاندارد SQL)، سرصفحه‌های ستون را به شناسه‌های معتبر SQL تبدیل می‌کند، و می‌تواند به‌صورت اختیاری نوع داده را استنتاج کند. فراتر از escape کردن پایه، یک مبدل مناسب نام سرصفحه‌ها را نرمال‌سازی می‌کند (جایگزینی فاصله و خط‌تیره با زیرخط) و خروجی را در یک بلوک تراکنش محصور می‌کند، تا در صورت شکست وارد کردن داده، عملیات به‌جای رها کردن داده‌های ناقص در جدول، به‌طور کامل برگشت داده شود. بدون چنین ابزاری، نوشتن دستی دستورات INSERT حتی برای چند صد سطر مستعد خطا و کند است.

چرا از مبدل CSV به SQL استفاده کنیم؟

نوشتن دستی دستورات SQL INSERT از داده‌های صفحه‌گسترده خسته‌کننده است و احتمال خطای نحوی دارد. یک مبدل بخش‌های تکراری را خودکار می‌کند تا بتوانید روی طراحی schema و اعتبارسنجی داده تمرکز کنید.

تولید SQL در چند ثانیه
CSV خود را بچسبانید و خروجی SQL آماده اجرا دریافت کنید. بدون نیاز به نقل‌قول‌گذاری دستی رشته‌ها، escape کردن آپوستروف‌ها یا شمارش ستون‌ها. تبدیل کاملاً در مرورگر شما انجام می‌شود.
🔒
داده‌ها در مرورگر شما باقی می‌مانند
CSV شما هرگز دستگاه شما را ترک نمی‌کند. تمام تجزیه و تولید SQL در سمت کلاینت انجام می‌شود، یعنی بدون آپلود به سرور، بدون ثبت لاگ، و بدون دسترسی شخص ثالث به مجموعه‌داده شما.
🎯
تولید نحو صحیح SQL
نقل‌قول‌های تکی داخل مقادیر طبق استاندارد SQL به '' escape می‌شوند. نام ستون‌ها به شناسه‌های معتبر تبدیل می‌شوند. خروجی از نظر نحوی برای PostgreSQL، MySQL و SQLite معتبر است.
📋
پشتیبانی از هر ساختار CSV
ابزار جداکننده‌ها (کاما، سمی‌کالن، تب، پایپ) را به‌طور خودکار تشخیص می‌دهد و فیلدهای نقل‌قول‌گذاری‌شده با کاما یا سطر جدید تعبیه‌شده را طبق قوانین RFC 4180 مدیریت می‌کند.

موارد استفاده تبدیل CSV به SQL

مقداردهی اولیه پایگاه داده
یک فایل fixture به فرمت CSV را به دستورات INSERT برای پایگاه‌های داده توسعه یا آزمایشی تبدیل کنید. برای pipeline‌های CI که به داده اولیه تکرارپذیر بدون ORM نیاز دارند مفید است.
مهاجرت داده
داده صادرشده از یک سیستم (CRM، صفحه‌گسترده، برنامه قدیمی) را به یک پایگاه داده رابطه‌ای جدید منتقل کنید. SQL را تولید کنید، آن را بررسی کنید، سپس در یک تراکنش اجرا کنید.
توسعه API بک‌اند
یک نمونه محلی PostgreSQL یا MySQL را به سرعت با داده آزمایشی از CSV پر کنید. سریع‌تر از نوشتن اسکریپت مهاجرت برای بارگذاری یک‌باره داده است.
تضمین کیفیت و اتوماسیون آزمون
SQL را از fixture‌های CSV آزمون تولید کنید تا قبل از آزمون‌های یکپارچگی، وضعیت پایگاه داده را آماده کنید. با یک اسکریپت پاک‌سازی ترکیب کنید تا جدول بین اجرای آزمون‌ها بازنشانی شود.
آماده‌سازی تحلیل داده
مجموعه‌داده‌های CSV را برای کوئری‌های موردی در SQLite بارگذاری کنید. SQLite دستورات SQL INSERT را مستقیماً می‌خواند و این مسیری سریع از صادرات صفحه‌گسترده به داده قابل کوئری است.
یادگیری SQL
دانشجویان می‌توانند CSV‌های نمونه را به SQL تبدیل کنند تا کوئری‌های SELECT، JOIN و توابع تجمعی را روی داده‌های واقعی بدون راه‌اندازی schema از صفر تمرین کنند.

مرجع نوع داده SQL

هنگام تبدیل CSV به SQL، هر ستون به‌طور پیش‌فرض TEXT می‌شود چون CSV هیچ فراداده نوع ندارد. اگر نوع ستون‌ها را می‌دانید، می‌توانید TEXT را در خروجی CREATE TABLE جایگزین کنید. این جدول رایج‌ترین انواع SQL و زمان استفاده از هر کدام را نشان می‌دهد.

نوعکاربردیادداشت‌ها
TEXT / VARCHARStrings, mixed contentDefault safe choice; works in every SQL dialect
INTEGER / INTWhole numbers (age, count, ID)Use when column contains only digits with no decimals
REAL / FLOATDecimal numbers (price, rate)Needed for columns with dots like 19.99 or 3.14
DATEISO 8601 dates (2024-01-15)Requires consistent formatting; varies by database
BOOLEANtrue/false, 1/0, yes/noMySQL uses TINYINT(1); PostgreSQL has native BOOL
NUMERIC / DECIMALExact precision (currency)Specify scale: DECIMAL(10,2) for money columns
BLOB / BYTEABinary dataRarely needed in CSV imports; use for hex-encoded fields

مقایسه گویش‌های SQL

نحو SQL بین موتورهای پایگاه داده متفاوت است. دستورات INSERT تولیدشده از SQL استاندارد استفاده می‌کنند که در اکثر سیستم‌ها کار می‌کند، اما برخی ویژگی‌ها متفاوتند. این جدول مهم‌ترین تفاوت‌ها هنگام وارد کردن داده CSV را خلاصه می‌کند.

ویژگیPostgreSQLMySQLSQLiteSQL Server
Identifier quoting"col"`col`"col"[col]
String escape'''' or \'''''
INSERT syntaxINSERT INTOINSERT INTOINSERT INTOINSERT INTO
Batch INSERTVALUES (),()…VALUES (),()…VALUES (),()…max 1000 rows
Auto-incrementSERIALAUTO_INCREMENTAUTOINCREMENTIDENTITY(1,1)
Upsert / mergeON CONFLICTON DUPLICATE KEYON CONFLICTMERGE
NULL handlingIS NULLIS NULL / <=>IS NULLIS NULL
COPY from CSVCOPY … FROMLOAD DATA INFILE.importBULK INSERT

INSERT در برابر COPY: انتخاب روش وارد کردن داده

برای مجموعه‌داده‌های کوچک تا متوسط (زیر ۱۰٬۰۰۰ سطر)، دستورات INSERT به‌خوبی کار می‌کنند و با همه پایگاه‌های داده SQL سازگار هستند. برای وارد کردن داده انبوه، پایگاه‌های داده دستورات بارگذاری انبوه فراهم می‌کنند که کاملاً از تجزیه SQL صرف‌نظر می‌کنند.

INSERT INTO
SQL استاندارد. در همه‌جا کار می‌کند. هر سطر به‌عنوان یک دستور SQL تجزیه می‌شود، پس سربار برای مجموعه‌داده‌های بزرگ بیشتر است. از منطق شرطی پشتیبانی می‌کند (ON CONFLICT، ON DUPLICATE KEY). بهترین گزینه برای داده اولیه، مهاجرت‌های کوچک و مواردی که به کنترل در سطح سطر نیاز دارید.
COPY / LOAD DATA
بارگذار انبوه اختصاصی پایگاه داده. PostgreSQL از COPY، MySQL از LOAD DATA INFILE، SQLite از .import و SQL Server از BULK INSERT استفاده می‌کند. CSV را مستقیماً می‌خواند و تجزیه SQL را نادیده می‌گیرد. برای فایل‌های بزرگ (۱۰۰٬۰۰۰+ سطر) ۱۰ تا ۱۰۰ برابر سریع‌تر است. به دسترسی فایل‌سیستم در سرور یا کلاینت نیاز دارد.

نمونه‌های کد

این نمونه‌ها نحوه تبدیل CSV به دستورات SQL INSERT در زبان‌های مختلف را نشان می‌دهند. هر نمونه escape کردن نقل‌قول تکی و پاک‌سازی نام ستون را پوشش می‌دهد.

JavaScript (Node.js)
// 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');
Python
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');
Go
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');
}
CLI (sqlite3 / psql)
# 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;"

سوالات متداول

نقل‌قول‌های تکی در مقادیر CSV چطور در خروجی SQL مدیریت می‌شوند؟
هر نقل‌قول تکی (') در مقدار CSV در خروجی SQL به '' دوبرابر می‌شود. این دنباله escape استاندارد SQL است. برای مثال، مقداری مانند «رضا اکبری» با آپوستروف در نام خانوادگی، در دستور INSERT به صورت صحیح escape می‌شود. این روش در PostgreSQL، MySQL، SQLite و SQL Server کار می‌کند.
آیا می‌توانم CSV را برای یک پایگاه داده خاص مانند MySQL یا PostgreSQL تبدیل کنم؟
دستورات INSERT تولیدشده از نحو SQL استاندارد استفاده می‌کنند که هم MySQL و هم PostgreSQL می‌پذیرند. تفاوت اصلی در نقل‌قول‌گذاری شناسه است: PostgreSQL از گیومه دوتایی استفاده می‌کند، MySQL از بک‌تیک. برای عملیات INSERT پایه، خروجی در هر دو بدون تغییر کار می‌کند.
اگر CSV من سطر سرصفحه نداشته باشد چه اتفاقی می‌افتد؟
مبدل اولین سطر را به‌عنوان سرصفحه ستون در نظر می‌گیرد. اگر CSV شما سرصفحه ندارد، قبل از تبدیل یک سطر سرصفحه اضافه کنید، وگرنه اولین سطر داده به نام ستون‌ها در دستور CREATE TABLE تبدیل می‌شود. اکثر مبدل‌ها، از جمله این ابزار، به سطر سرصفحه نیاز دارند.
آیا محدودیتی برای تعداد سطر در تبدیل CSV به SQL وجود دارد؟
چون تبدیل در مرورگر شما انجام می‌شود، محدودیت عملی به حافظه دستگاه شما بستگی دارد. فایل‌هایی با ده‌ها هزار سطر بدون مشکل تبدیل می‌شوند. برای فایل‌های بسیار بزرگ (۵۰۰٬۰۰۰+ سطر)، استفاده از دستور COPY یا LOAD DATA بومی پایگاه داده به‌جای دستورات INSERT توصیه می‌شود.
چرا خروجی برای تمام ستون‌ها از TEXT استفاده می‌کند نه INTEGER یا DATE؟
CSV یک فرمت متن‌ساده بدون فراداده نوع است. مبدل از TEXT به‌عنوان پیش‌فرض امن استفاده می‌کند تا از استنتاج نوع نادرست جلوگیری کند. پس از بررسی داده، می‌توانید نوع ستون‌ها را در دستور CREATE TABLE تولیدشده تغییر دهید. INTEGER برای ستون‌های عددی و DATE برای ستون‌های تاریخ گزینه‌های رایج هستند.
چطور باید فایل‌های CSV با سمی‌کالن یا تب به‌عنوان جداکننده را مدیریت کنم؟
این ابزار جداکننده را با تحلیل اولین سطر CSV به‌طور خودکار تشخیص می‌دهد. کاما، سمی‌کالن، تب و کاراکتر پایپ را بررسی می‌کند و از پرتکرارترین آن‌ها استفاده می‌کند. فایل‌های CSV با فرمت اروپایی که از سمی‌کالن استفاده می‌کنند بدون هیچ تنظیمی کار می‌کنند.
آیا SQL تولیدشده در برابر injection امن است اگر مستقیماً اجرا شود؟
خروجی نقل‌قول‌های تکی را escape می‌کند که از خطاهای نحوی تصادفی جلوگیری می‌کند. با این حال، اگر داده CSV شما از منبع غیرقابل‌اعتماد می‌آید، SQL تولیدشده را مانند هر ورودی اعتبارسنجی‌نشده‌ای در نظر بگیرید. قبل از اجرا روی پایگاه داده تولیدی، خروجی را بررسی کنید. برای وارد کردن داده به‌صورت برنامه‌نویسانه، کوئری‌های پارامتری همیشه از الحاق رشته‌ها امن‌تر هستند.