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 مع الاقتباس، ويُهرِّب علامات الاقتباس المفردة داخل القيم (بمضاعفتها إلى '' وفق معيار SQL)، ويربط رؤوس الأعمدة بمعرّفات SQL صالحة، ويمكنه اختياريًا استنتاج أنواع البيانات. وبما يتجاوز التهريب الأساسي، يُوحِّد المحوّل الجيد أسماء الرؤوس (باستبدال المسافات والشُّرَط بشَرطات سفلية)، ويلفّ المخرج في كتلة معاملة (transaction block)، بحيث تتراجع العملية بالكامل عند فشل الاستيراد بدلًا من إبقاء بيانات جزئية في الجدول. دون محوّل، كتابة جمل INSERT يدويًا حتى لبضع مئات من الصفوف عملية مُرهِقة وعُرضة للأخطاء.

لماذا تستخدم محوّل CSV إلى SQL؟

كتابة جمل SQL INSERT يدويًا من بيانات جداول البيانات عملية مُضنية وتفتح الباب لأخطاء نحوية. يُؤتمت المحوّل الأجزاءَ المتكررة حتى تتفرّغ لتصميم المخطط والتحقق من صحة البيانات.

توليد SQL في ثوانٍ
الصق بيانات CSV واحصل على مخرج SQL جاهز للتشغيل. لا داعي لوضع علامات الاقتباس يدويًا، أو تهريب الفواصل العليا، أو إحصاء الأعمدة. يعمل التحويل كاملًا في متصفحك.
🔒
احتفظ بالبيانات في متصفحك
لا تغادر بيانات CSV جهازَك قط. تجري عمليات التحليل وتوليد SQL على جانب العميل بالكامل، مما يعني عدم رفع أي شيء إلى خادم، وعدم تسجيل أي بيانات، وعدم وصول أي طرف ثالث إلى مجموعة بياناتك.
🎯
إنتاج بناء SQL صحيح
تُهرَّب علامات الاقتباس المفردة داخل القيم إلى '' وفق معيار SQL. تُنقَّى أسماء الأعمدة لتصبح معرّفات صالحة. المخرج صحيح نحويًا لـ PostgreSQL وMySQL وSQLite.
📋
التعامل مع أي هيكل CSV
تكتشف الأداة المحدِّد تلقائيًا (فاصلة، فاصلة منقوطة، مسافة جدولة، شرطة عمودية) وتعالج الحقول المحاطة بعلامات اقتباس التي تحتوي على فواصل أو فواصل أسطر مضمّنة، وفق قواعد RFC 4180.

حالات استخدام CSV إلى SQL

تهيئة قواعد البيانات
حوّل ملف CSV إلى جمل INSERT لتهيئة قواعد بيانات التطوير أو بيئة الاختبار المرحلي. مفيد في سلاسل CI حيث تحتاج إلى بيانات أولية قابلة للتكرار دون استخدام ORM.
ترحيل البيانات
انقل البيانات المُصدَّرة من نظام ما (CRM، جداول بيانات، تطبيق قديم) إلى قاعدة بيانات علائقية جديدة. ولّد SQL وراجعه، ثم نفِّذه ضمن معاملة.
تطوير الواجهة الخلفية للـ API
أضف بيانات اختبار من CSV إلى نسخة PostgreSQL أو MySQL محلية بسرعة. أسرع من كتابة سكريبت ترحيل حين تحتاج إلى تحميل بيانات مرة واحدة فحسب.
ضمان الجودة وأتمتة الاختبار
ولّد SQL من نماذج اختبار CSV لإعداد حالة قاعدة البيانات قبل اختبارات التكامل. اقرنها بسكريبت إعادة ضبط لاستعادة الجدول إلى حالته الأصلية بين دورات الاختبار.
تحضير تحليل البيانات
حمّل مجموعات بيانات CSV إلى SQLite لإجراء استعلامات تحليلية سريعة. تقرأ SQLite جمل SQL INSERT مباشرةً، مما يجعل هذا المسار سريعًا من تصدير جداول البيانات إلى بيانات قابلة للاستعلام.
تعلّم SQL
يستطيع الطلاب تحويل ملفات CSV نموذجية إلى SQL لتدريب استعلامات SELECT وJOIN والتجميع على بيانات تبدو حقيقية دون الحاجة إلى بناء مخطط من الصفر.

مرجع أنواع بيانات 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: اختيار طريقة الاستيراد

لمجموعات البيانات الصغيرة والمتوسطة (أقل من 10,000 صف)، تعمل جمل 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. أسرع بمقدار 10-100 مرة للملفات الكبيرة (أكثر من 100K صف). يتطلب وصولًا إلى نظام الملفات على الخادم أو العميل.

أمثلة برمجية

توضح هذه الأمثلة كيفية تحويل CSV إلى جمل SQL INSERT بلغات برمجية مختلفة. تتعامل كل منها مع تهريب علامات الاقتباس المفردة وتنقية أسماء الأعمدة.

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. هذا هو تسلسل الإفلات المعياري في SQL. على سبيل المثال، قيمة مثل "O'Brien" تصبح 'O''Brien' في جملة INSERT. يعمل هذا في PostgreSQL وMySQL وSQLite وSQL Server.
هل يمكنني تحويل CSV إلى SQL لقاعدة بيانات محددة مثل MySQL أو PostgreSQL؟
تستخدم جمل INSERT المولَّدة بناء SQL معياريًا يقبله كلٌّ من MySQL وPostgreSQL. الفارق الرئيسي هو اقتباس المعرّفات: يستخدم PostgreSQL علامات الاقتباس المزدوجة، بينما يستخدم MySQL العلامات الخلفية (backticks). لعمليات INSERT الأساسية، يعمل المخرج في كليهما دون أي تعديل.
ماذا يحدث إذا كان ملف CSV لا يحتوي على صف رؤوس؟
يعامل المحوّل الصف الأول على أنه رؤوس الأعمدة. إذا كان ملف CSV يفتقر إلى رؤوس، أضف صف رؤوس قبل التحويل، وإلا سيصبح صف البيانات الأول أسماءَ الأعمدة في جملة CREATE TABLE. تشترط معظم المحوّلات، بما فيها هذه الأداة، وجود صف رؤوس.
هل ثمة حد لعدد الصفوف في تحويل CSV إلى SQL؟
بما أن التحويل يعمل في متصفحك، يعتمد الحد العملي على ذاكرة جهازك. تُحوَّل الملفات التي تحتوي على عشرات الآلاف من الصفوف دون مشكلات. للملفات الكبيرة جدًا (أكثر من 500K صف)، يُستحسن استخدام أمر COPY أو LOAD DATA الأصلي لقاعدة البيانات عوضًا عن جمل INSERT.
لماذا يستخدم المخرج النوع TEXT لجميع الأعمدة بدلًا من INTEGER أو DATE؟
CSV شكل نص عادي لا يحتوي على بيانات وصفية للأنواع. يستخدم المحوّل TEXT افتراضيًا آمنًا لتفادي استنتاج أنواع خاطئة. يمكنك تغيير أنواع الأعمدة في جملة CREATE TABLE المولَّدة بعد مراجعة بياناتك. INTEGER للأعمدة الرقمية وDATE لأعمدة التواريخ هما التعديلان الأكثر شيوعًا.
كيف أتعامل مع ملفات CSV التي تستخدم الفاصلة المنقوطة أو المسافة الجدولية كمحدِّدات؟
تكتشف هذه الأداة المحدِّد تلقائيًا عبر تحليل الصف الأول من ملف CSV. تفحص الفاصلة والفاصلة المنقوطة والمسافة الجدولية وحرف الشرطة العمودية، ثم تستخدم الأكثر ظهورًا. تعمل ملفات CSV بالتنسيق الأوروبي التي تستخدم الفاصلة المنقوطة دون أي تغيير في الإعدادات.
هل SQL المولَّد آمن من حقن SQL إذا نفّذته مباشرةً؟
يُهرِّب المخرج علامات الاقتباس المفردة مما يمنع أخطاء النحو العرضية. غير أنك إذا كانت بيانات CSV مصدرها مصدر غير موثوق، فعامل SQL المولَّد كما تعامل أي مدخلات لم تُتحقق منها. راجع المخرج قبل تشغيله على قاعدة بيانات إنتاجية. للاستيرادات البرمجية، الاستعلامات ذات المعاملات (parameterized queries) دائمًا أكثر أمانًا من تسلسل النصوص.