CSV থেকে SQL
CSV ডেটা থেকে SQL INSERT স্টেটমেন্ট তৈরি করুন
CSV ইনপুট
SQL আউটপুট
CSV থেকে SQL রূপান্তর কী?
CSV থেকে SQL রূপান্তর কমা-বিভক্ত মানগুলিকে Structured Query Language স্টেটমেন্টে রূপান্তরিত করে, যা একটি রিলেশনাল ডেটাবেসে চালানো যায়। সবচেয়ে সাধারণ আউটপুট হলো দুটি অংশ: একটি CREATE TABLE স্টেটমেন্ট যা কলামগুলি নির্ধারণ করে, এবং এক বা একাধিক INSERT INTO স্টেটমেন্ট যা CSV ফাইলের সারিগুলি দিয়ে সেই কলামগুলি পূরণ করে।
CSV ফাইলগুলি RFC 4180 স্পেসিফিকেশন অনুসরণ করে। প্রতিটি লাইন একটি রেকর্ড, ক্ষেত্রগুলি একটি বিভাজক দিয়ে আলাদা করা হয় (সাধারণত কমা), এবং বিভাজক বা নতুন লাইন ধারণকারী ক্ষেত্রগুলি ডাবল কোটে রাখা হয়। অন্যদিকে, SQL হলো PostgreSQL, MySQL, SQLite ও SQL Server-এর মতো সিস্টেমে ডেটা পরিচালনার মানক ভাষা। এই দুটি ফরম্যাটের মধ্যে রূপান্তর সফটওয়্যার ডেভেলপমেন্টে সবচেয়ে কমন ডেটা ইম্পোর্ট কাজগুলির মধ্যে একটি।
একটি সঠিক CSV-থেকে-SQL কনভার্টার উদ্ধৃতি পরিচালনা করে, মানের মধ্যে একক উদ্ধৃতি এস্কেপ করে (SQL মান অনুযায়ী '' করে দ্বিগুণ করে), কলাম শিরোনামগুলিকে বৈধ SQL শনাক্তকারীতে ম্যাপ করে এবং ঐচ্ছিকভাবে ডেটার ধরন অনুমান করতে পারে। মৌলিক এস্কেপিংয়ের বাইরে, একটি ভালো কনভার্টার শিরোনামের নামগুলি স্বাভাবিক করে (স্পেস ও হাইফেন আন্ডারস্কোর দিয়ে প্রতিস্থাপন করে) এবং আউটপুটকে একটি ট্রানজ্যাকশন ব্লকে মোড়ায়, যাতে আমদানি ব্যর্থ হলে টেবিলে আংশিক ডেটা না রেখে পরিষ্কারভাবে রোলব্যাক হয়। কনভার্টার ছাড়া, কয়েকশত সারির জন্যও হাতে INSERT স্টেটমেন্ট লেখা ত্রুটিপ্রবণ ও ধীর।
CSV থেকে SQL কনভার্টার কেন ব্যবহার করবেন?
স্প্রেডশিট ডেটা থেকে হাতে SQL INSERT স্টেটমেন্ট লেখা ক্লান্তিকর এবং সিনট্যাক্স ত্রুটি ডেকে আনে। একটি কনভার্টার পুনরাবৃত্তিমূলক অংশগুলি স্বয়ংক্রিয় করে যাতে আপনি স্কিমা ডিজাইন ও ডেটা যাচাইয়ে মনোযোগ দিতে পারেন।
CSV থেকে SQL-এর ব্যবহারের ক্ষেত্র
SQL ডেটা টাইপ রেফারেন্স
CSV থেকে SQL-এ রূপান্তর করার সময়, প্রতিটি কলাম TEXT-এ ডিফল্ট হয় কারণ CSV-এ কোনো টাইপ মেটাডেটা নেই। আপনি যদি কলামের ধরন জানেন, তাহলে CREATE TABLE আউটপুটে TEXT প্রতিস্থাপন করতে পারেন। এই টেবিলটি সবচেয়ে সাধারণ SQL টাইপ এবং কখন প্রতিটি ব্যবহার করবেন তা দেখায়।
| টাইপ | ব্যবহৃত হয় | নোট |
|---|---|---|
| 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 ডায়ালেক্ট তুলনা
SQL সিনট্যাক্স বিভিন্ন ডেটাবেস ইঞ্জিনের মধ্যে ভিন্ন হয়। তৈরি INSERT স্টেটমেন্টগুলি মানক SQL ব্যবহার করে যা বেশিরভাগ সিস্টেমে কাজ করে, তবে কিছু বৈশিষ্ট্য আলাদা। এই টেবিলটি CSV ডেটা আমদানি করার সময় সবচেয়ে গুরুত্বপূর্ণ পার্থক্যগুলি সংক্ষিপ্ত করে।
| বৈশিষ্ট্য | 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 বনাম COPY: আমদানি পদ্ধতি বেছে নেওয়া
ছোট থেকে মাঝারি ডেটাসেটের জন্য (১০,০০০ সারির কম), INSERT স্টেটমেন্টগুলি ভালোভাবে কাজ করে এবং প্রতিটি SQL ডেটাবেসে বহনযোগ্য। বড় আমদানির জন্য, ডেটাবেসগুলি বাল্ক-লোডিং কমান্ড সরবরাহ করে যা সম্পূর্ণরূপে SQL পার্সার বাইপাস করে।
কোড উদাহরণ
এই উদাহরণগুলি দেখায় কীভাবে বিভিন্ন ভাষায় CSV-কে SQL INSERT স্টেটমেন্টে রূপান্তর করতে হয়। প্রতিটি একক উদ্ধৃতি এস্কেপিং ও কলামের নাম পরিষ্করণ পরিচালনা করে।
// 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;"