CSV to SQL

SQL INSERT-statements genereren vanuit CSV-gegevens

Probeer een voorbeeld

CSV-invoer

SQL-uitvoer

Draait lokaal · Veilig om secrets te plakken
SQL verschijnt hier…
Tabelnaam:

Wat is CSV naar SQL-conversie?

CSV naar SQL-conversie zet kommagescheiden waarden om naar Structured Query Language-statements die een relationele database kan uitvoeren. De meest voorkomende uitvoer bestaat uit een tweetal: een CREATE TABLE-statement dat kolommen definieert, en een of meer INSERT INTO-statements die die kolommen vullen met de rijen uit het CSV-bestand.

CSV-bestanden volgen de RFC 4180-specificatie. Elke regel is een record, velden worden gescheiden door een scheidingsteken (doorgaans een komma), en velden die het scheidingsteken of regeleinden bevatten worden omsloten door dubbele aanhalingstekens. SQL daarentegen is de standaardtaal voor gegevensbeheer in systemen als PostgreSQL, MySQL, SQLite en SQL Server. Omzetten tussen deze twee formaten is een van de meest voorkomende gegevensimporttaken in softwareontwikkeling.

Een goede CSV-naar-SQL-converter handelt aanhalingstekens af, escapet enkele aanhalingstekens in waarden (door ze te verdubbelen naar '' conform de SQL-standaard), brengt kolomkoppen in kaart naar geldige SQL-identifiers en kan optioneel gegevenstypen afleiden. Naast basisescaping normaliseert een goede converter kopteksten (spaties en koppeltekens vervangen door underscores) en wikkelt de uitvoer in een transactieblok, zodat een mislukte import netjes teruggedraaid wordt in plaats van gedeeltelijke gegevens achter te laten in de tabel. Zonder converter is het handmatig schrijven van INSERT-statements voor zelfs een paar honderd rijen foutgevoelig en tijdrovend.

Waarom een CSV naar SQL-converter gebruiken?

SQL INSERT-statements handmatig schrijven vanuit spreadsheetgegevens is omslachtig en leidt tot syntaxfouten. Een converter automatiseert de repetitieve onderdelen zodat je je kunt richten op schemaontwerp en gegevensvalidatie.

SQL in seconden genereren
Plak je CSV, ontvang direct uitvoerbare SQL. Geen handmatig quoten van strings, escapen van apostrofs of tellen van kolommen. De conversie verloopt volledig in je browser.
🔒
Gegevens in je browser houden
Je CSV verlaat je apparaat nooit. Alle verwerking en SQL-generatie vindt client-side plaats, wat betekent geen serverupload, geen logging en geen toegang van derden tot je gegevensset.
🎯
Correcte SQL-syntaxis produceren
Enkele aanhalingstekens in waarden worden geëscapet als '' conform de SQL-standaard. Kolomnamen worden omgezet naar geldige identifiers. De uitvoer is syntactisch geldig voor PostgreSQL, MySQL en SQLite.
📋
Elke CSV-structuur verwerken
De tool detecteert scheidingstekens automatisch (komma, puntkomma, tab, pipe) en verwerkt geciteerde velden met ingesloten komma's of regeleinden, conform RFC 4180.

Toepassingen van CSV naar SQL

Database seeding
Zet een CSV-fixture-bestand om naar INSERT-statements voor ontwikkel- of stagingdatabases. Handig in CI-pipelines waar je herhaalbare testgegevens nodig hebt zonder een ORM.
Gegevensmigratie
Verplaats gegevens die zijn geëxporteerd uit een ander systeem (CRM, spreadsheet, verouderde applicatie) naar een nieuwe relationele database. Genereer de SQL, controleer het, en voer het uit in een transactie.
Backend API-ontwikkeling
Vul snel een lokale PostgreSQL- of MySQL-instantie met testgegevens uit een CSV. Sneller dan het schrijven van een migratiescript voor een eenmalige import.
QA en testautomatisering
Genereer SQL vanuit CSV-testfixtures om de databasetoestand in te stellen vóór integratietests. Combineer het met een teardown-script om de tabel te resetten tussen testruns.
Voorbereiding van data-analyse
Laad CSV-datasets in SQLite voor ad-hocqueries. SQLite leest SQL INSERT-statements direct, waardoor dit een snelle route is van spreadsheetexport naar doorzoekbare gegevens.
SQL leren
Studenten kunnen voorbeeld-CSV's omzetten naar SQL om SELECT-, JOIN- en aggregatiequery's te oefenen op realistische gegevens, zonder een schema helemaal zelf op te zetten.

Referentie SQL-gegevenstypen

Bij het omzetten van CSV naar SQL krijgt elke kolom standaard het type TEXT, omdat CSV geen typemetadata bevat. Als je de kolomtypen kent, kun je TEXT in de CREATE TABLE-uitvoer vervangen. Deze tabel toont de meest gebruikte SQL-typen en wanneer je ze toepast.

TypeGebruikt voorOpmerkingen
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

Vergelijking SQL-dialecten

SQL-syntaxis verschilt per database-engine. De gegenereerde INSERT-statements gebruiken standaard SQL die in de meeste systemen werkt, maar bepaalde functies wijken af. Deze tabel geeft een overzicht van de verschillen die het meest relevant zijn bij het importeren van CSV-gegevens.

FunctiePostgreSQLMySQLSQLiteSQL 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: een importmethode kiezen

Voor kleine tot middelgrote datasets (minder dan 10.000 rijen) werken INSERT-statements goed en zijn ze overdraagbaar naar elke SQL-database. Voor grote imports bieden databases bulklaadopdrachten die de SQL-parser volledig omzeilen.

INSERT INTO
Standaard SQL. Werkt overal. Elke rij wordt verwerkt als een SQL-statement, waardoor de overhead groter is bij grote datasets. Ondersteunt conditionele logica (ON CONFLICT, ON DUPLICATE KEY). Het meest geschikt voor seed-gegevens, kleine migraties en gevallen waarbij controle per rij nodig is.
COPY / LOAD DATA
Database-specifieke bulklader. PostgreSQL gebruikt COPY, MySQL gebruikt LOAD DATA INFILE, SQLite gebruikt .import en SQL Server gebruikt BULK INSERT. Leest CSV direct, waarbij de SQL-parser wordt overgeslagen. 10 tot 100 keer sneller voor grote bestanden (100K+ rijen). Vereist bestandsysteemtoegang op de server of client.

Codevoorbeelden

Deze voorbeelden laten zien hoe je CSV omzet naar SQL INSERT-statements in verschillende programmeertalen. Elk voorbeeld verwerkt het escapen van enkele aanhalingstekens en het opschonen van kolomnamen.

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

Veelgestelde vragen

Hoe worden enkele aanhalingstekens in CSV-waarden verwerkt in de SQL-uitvoer?
Elk enkel aanhalingsteken (') in een CSV-waarde wordt verdubbeld naar '' in de SQL-uitvoer. Dit is de standaard escape-reeks in SQL. Een waarde als "O'Brien" wordt bijvoorbeeld 'O''Brien' in het INSERT-statement. Dit werkt in PostgreSQL, MySQL, SQLite en SQL Server.
Kan ik CSV naar SQL omzetten voor een specifieke database zoals MySQL of PostgreSQL?
De gegenereerde INSERT-statements gebruiken standaard SQL-syntaxis die zowel MySQL als PostgreSQL accepteren. Het voornaamste verschil is het quoten van identifiers: PostgreSQL gebruikt dubbele aanhalingstekens, MySQL gebruikt backticks. Voor eenvoudige INSERT-bewerkingen werkt de uitvoer in beide systemen zonder aanpassingen.
Wat gebeurt er als mijn CSV geen koprij heeft?
De converter behandelt de eerste rij als kolomkoppen. Als je CSV geen koppen heeft, voeg dan een koprij toe vóór de conversie, anders wordt de eerste datarij de kolomnamen in het CREATE TABLE-statement. De meeste converters, inclusief deze, vereisen een koprij.
Is er een rijlimiet voor de CSV naar SQL-conversie?
Omdat de conversie in je browser wordt uitgevoerd, hangt de praktische limiet af van het geheugen van je apparaat. Bestanden met tienduizenden rijen worden probleemloos omgezet. Voor zeer grote bestanden (500K+ rijen) kun je beter de native COPY- of LOAD DATA-opdracht van de database gebruiken in plaats van INSERT-statements.
Waarom gebruikt de uitvoer TEXT voor alle kolommen in plaats van INTEGER of DATE?
CSV is een platte-tekstindeling zonder typemetadata. De converter gebruikt TEXT als veilige standaard om onjuiste type-inferentie te vermijden. Je kunt de kolomtypen in het gegenereerde CREATE TABLE-statement aanpassen nadat je je gegevens hebt beoordeeld. INTEGER voor numerieke kolommen en DATE voor datumkolommen zijn veelvoorkomende aanpassingen.
Hoe ga ik om met CSV-bestanden met puntkomma's of tabs als scheidingsteken?
Deze tool detecteert het scheidingsteken automatisch door de eerste rij van je CSV te analyseren. Het controleert op komma's, puntkomma's, tabs en pipe-tekens, en gebruikt het teken dat het vaakst voorkomt. CSV-bestanden in Europees formaat met puntkomma's werken zonder enige configuratiewijziging.
Is de gegenereerde SQL veilig tegen injectie als ik het direct uitvoer?
De uitvoer escapet enkele aanhalingstekens, wat onbedoelde syntaxfouten voorkomt. Als je CSV-gegevens echter afkomstig zijn van een niet-vertrouwde bron, behandel de gegenereerde SQL dan op dezelfde manier als andere niet-gevalideerde invoer. Controleer de uitvoer voordat je deze uitvoert op een productiedatabase. Voor programmatische imports zijn geparametriseerde query's altijd veiliger dan het samenvoegen van strings.