CSV to SQL

Generujte SQL INSERT příkazy z CSV dat

Zkusit příklad

CSV vstup

SQL výstup

Běží lokálně · Bezpečné pro vkládání tajných údajů
SQL se zobrazí zde…
Název tabulky:

Co je převod CSV na SQL?

Převod CSV na SQL transformuje hodnoty oddělené čárkami na příkazy Structured Query Language, které může vykonat relační databáze. Nejběžnějším výstupem je dvojice: příkaz CREATE TABLE, který definuje sloupce, a jeden nebo více příkazů INSERT INTO, které naplní tyto sloupce řádky z CSV souboru.

CSV soubory se řídí specifikací RFC 4180. Každý řádek je záznam, pole jsou oddělena oddělovačem (zpravidla čárkou) a pole obsahující oddělovač nebo konce řádků jsou uzavřena do dvojitých uvozovek. SQL je naproti tomu standardní jazyk pro správu dat v systémech jako PostgreSQL, MySQL, SQLite a SQL Server. Převod mezi těmito dvěma formáty patří k nejčastějším úlohám importu dat při vývoji softwaru.

Správný CSV-to-SQL převodník zvládá uvozování, escapuje jednoduché uvozovky uvnitř hodnot (jejich zdvojením na '' podle standardu SQL), mapuje záhlaví sloupců na platné SQL identifikátory a volitelně dokáže odvodit datové typy. Kromě základního escapování dobrý převodník normalizuje názvy záhlaví (nahrazuje mezery a pomlčky podtržítky) a obaluje výstup do transakčního bloku, takže při selhání importu dojde k čistému vrácení změn místo ponechání neúplných dat v tabulce. Bez převodníku je ruční psaní příkazů INSERT pro i jen několik set řádků náchylné k chybám a zdlouhavé.

Proč používat převodník CSV na SQL?

Ruční psaní SQL INSERT příkazů z dat tabulkového procesoru je únavné a snadno vede k syntaktickým chybám. Převodník automatizuje opakující se části, takže se můžete soustředit na návrh schématu a ověřování dat.

Generujte SQL během sekund
Vložte CSV, získejte SQL připravené ke spuštění. Není třeba ručně uvozovat řetězce, escapovat apostrofy ani počítat sloupce. Převod probíhá zcela ve vašem prohlížeči.
🔒
Data zůstávají v prohlížeči
Váš CSV soubor nikdy neopustí váš počítač. Veškeré parsování a generování SQL probíhá na straně klienta — žádné nahrávání na server, žádné logování, žádný přístup třetích stran k vašim datům.
🎯
Správná syntaxe SQL
Jednoduché uvozovky uvnitř hodnot jsou escapovány jako '' podle standardu SQL. Názvy sloupců jsou upraveny na platné identifikátory. Výstup je syntakticky platný pro PostgreSQL, MySQL a SQLite.
📋
Podpora libovolné struktury CSV
Nástroj automaticky rozpozná oddělovač (čárka, středník, tabulátor, svislice) a zpracuje uvozovaná pole s vloženými čárkami nebo konci řádků podle pravidel RFC 4180.

Případy použití CSV na SQL

Naplnění databáze výchozími daty
Převeďte CSV soubor s testovacími daty na příkazy INSERT pro vývojové nebo testovací databáze. Užitečné v CI pipeline, kde potřebujete opakovatelná výchozí data bez ORM.
Migrace dat
Přesuňte data exportovaná z jednoho systému (CRM, tabulkový procesor, stará aplikace) do nové relační databáze. Vygenerujte SQL, zkontrolujte ho a spusťte v transakci.
Vývoj backendového API
Rychle naplňte lokální instanci PostgreSQL nebo MySQL testovacími daty z CSV. Rychlejší než psaní migračního skriptu, pokud potřebujete jednorázové načtení dat.
QA a automatizace testů
Generujte SQL z CSV testovacích dat pro nastavení stavu databáze před integračními testy. Kombinujte s teardown skriptem pro resetování tabulky mezi jednotlivými běhy testů.
Příprava datové analýzy
Načtěte CSV datové sady do SQLite pro ad-hoc dotazy. SQLite čte SQL INSERT příkazy přímo, což tvoří rychlou cestu od exportu tabulky k dotazovatelným datům.
Výuka SQL
Studenti mohou převádět ukázkové CSV soubory na SQL a procvičovat dotazy SELECT, JOIN a agregační funkce na reálně vypadajících datech bez nutnosti nastavovat schéma od začátku.

Přehled datových typů SQL

Při převodu CSV na SQL jsou všechny sloupce ve výchozím nastavení TEXT, protože CSV neobsahuje metadata o typech. Pokud typy sloupců znáte, můžete TEXT ve výstupu CREATE TABLE nahradit. Tato tabulka ukazuje nejběžnější typy SQL a kdy každý z nich použít.

TypPoužitíPoznámky
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

Porovnání SQL dialektů

Syntaxe SQL se liší mezi databázovými stroji. Generované příkazy INSERT používají standardní SQL, které funguje ve většině systémů, ale některé funkce se liší. Tato tabulka shrnuje rozdíly, které jsou při importu CSV dat nejdůležitější.

FunkcePostgreSQLMySQLSQLiteSQL 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 vs COPY: volba metody importu

Pro malé a střední datové sady (do 10 000 řádků) příkazy INSERT fungují dobře a jsou přenositelné mezi všemi SQL databázemi. Pro velké importy poskytují databáze příkazy pro hromadné načítání, které zcela obcházejí SQL parser.

INSERT INTO
Standardní SQL. Funguje všude. Každý řádek je zpracován jako SQL příkaz, takže režie je u velkých datových sad vyšší. Podporuje podmíněnou logiku (ON CONFLICT, ON DUPLICATE KEY). Nejlepší pro výchozí data, malé migrace a případy, kdy potřebujete kontrolu na úrovni řádků.
COPY / LOAD DATA
Nástroj pro hromadné načítání specifický pro danou databázi. PostgreSQL používá COPY, MySQL používá LOAD DATA INFILE, SQLite používá .import a SQL Server používá BULK INSERT. Čte CSV přímo a obchází SQL parser. 10–100× rychlejší pro velké soubory (100 000+ řádků). Vyžaduje přístup k souborovému systému na serveru nebo klientovi.

Ukázky kódu

Tyto ukázky ukazují, jak převést CSV na SQL INSERT příkazy v různých programovacích jazycích. Každá z nich zpracovává escapování jednoduchých uvozovek a sanitizaci názvů sloupců.

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;"

Často kladené otázky

Jak jsou jednoduché uvozovky v hodnotách CSV zpracovány ve výstupu SQL?
Každá jednoduchá uvozovka (') v hodnotě CSV je ve výstupu SQL zdvojena na ''. Jedná se o standardní escape sekvenci SQL. Například hodnota jako "O'Brien" se v příkazu INSERT zapíše jako 'O''Brien'. Toto funguje v PostgreSQL, MySQL, SQLite a SQL Server.
Mohu převést CSV na SQL pro konkrétní databázi, jako je MySQL nebo PostgreSQL?
Generované příkazy INSERT používají standardní syntaxi SQL, kterou přijímají jak MySQL, tak PostgreSQL. Hlavní rozdíl je v uvozování identifikátorů: PostgreSQL používá dvojité uvozovky, MySQL používá zpětné uvozovky. Pro základní operace INSERT výstup funguje v obou bez úprav.
Co se stane, pokud můj CSV soubor nemá řádek záhlaví?
Převodník považuje první řádek za záhlaví sloupců. Pokud váš CSV soubor záhlaví nemá, přidejte řádek záhlaví před převodem, jinak se první datový řádek stane názvy sloupců v příkazu CREATE TABLE. Většina převodníků, včetně tohoto, vyžaduje řádek záhlaví.
Existuje limit počtu řádků pro převod CSV na SQL?
Protože převod probíhá ve vašem prohlížeči, praktický limit závisí na paměti vašeho zařízení. Soubory s desítkami tisíc řádků se převádějí bez problémů. Pro velmi velké soubory (500 000+ řádků) zvažte použití nativního příkazu COPY nebo LOAD DATA dané databáze místo příkazů INSERT.
Proč výstup používá TEXT pro všechny sloupce místo INTEGER nebo DATE?
CSV je formát prostého textu bez metadata o typech. Převodník používá TEXT jako bezpečnou výchozí hodnotu, aby se vyhnul nesprávnému odvozování typů. Typy sloupců můžete změnit ve vygenerovaném příkazu CREATE TABLE po kontrole dat. Obvyklé úpravy jsou INTEGER pro číselné sloupce a DATE pro sloupce s datem.
Jak mám pracovat s CSV soubory, kde jsou jako oddělovač použity středníky nebo tabulátory?
Tento nástroj automaticky rozpozná oddělovač analýzou prvního řádku vašeho CSV. Kontroluje čárky, středníky, tabulátory a svislice a použije ten, který se vyskytuje nejčastěji. CSV soubory v evropském formátu používající středníky fungují bez jakékoli změny konfigurace.
Je generované SQL bezpečné před injekcí, pokud ho spustím přímo?
Výstup escapuje jednoduché uvozovky, čímž zabraňuje náhodným syntaktickým chybám. Pokud však vaše CSV data pocházejí z nedůvěryhodného zdroje, zacházejte s generovaným SQL stejně jako s jakýmkoli neověřeným vstupem. Zkontrolujte výstup před spuštěním v produkční databázi. Při programovém importu jsou parametrizované dotazy vždy bezpečnější než zřetězení řetězců.