CSV vers SQL

Générez des instructions SQL INSERT à partir de données CSV

Essayer un exemple

Entrée CSV

Sortie SQL

Fonctionne localement · Sûr pour coller des secrets
Le SQL apparaîtra ici…
Nom de la table :

Qu'est-ce que la conversion CSV vers SQL ?

La conversion CSV vers SQL transforme des valeurs séparées par des virgules en instructions SQL que peut exécuter une base de données relationnelle. Le résultat le plus courant est un couple : une instruction CREATE TABLE qui définit les colonnes, et une ou plusieurs instructions INSERT INTO qui peuplent ces colonnes avec les lignes du fichier CSV.

Les fichiers CSV suivent la spécification RFC 4180. Chaque ligne correspond à un enregistrement, les champs sont séparés par un délimiteur (généralement une virgule), et les champs contenant le délimiteur ou des sauts de ligne sont encadrés de guillemets doubles. SQL, quant à lui, est le langage standard pour gérer les données dans des systèmes comme PostgreSQL, MySQL, SQLite et SQL Server. La conversion entre ces deux formats est l'une des tâches d'import de données les plus fréquentes en développement logiciel.

Un convertisseur CSV vers SQL digne de ce nom gère les guillemets, échappe les apostrophes dans les valeurs (en les doublant en '' selon la norme SQL), associe les en-têtes de colonnes à des identifiants SQL valides, et peut optionnellement inférer les types de données. Au-delà de l'échappement basique, un bon convertisseur normalise les noms d'en-têtes (en remplaçant les espaces et les tirets par des underscores) et encapsule la sortie dans un bloc de transaction, de sorte qu'un échec d'import effectue un rollback propre plutôt que de laisser des données partielles dans la table. Sans convertisseur, écrire manuellement des instructions INSERT pour quelques centaines de lignes est fastidieux et source d'erreurs.

Pourquoi utiliser un convertisseur CSV vers SQL ?

Rédiger des instructions SQL INSERT à la main à partir de données issues d'un tableur est fastidieux et source d'erreurs de syntaxe. Un convertisseur automatise les parties répétitives pour que vous puissiez vous concentrer sur la conception du schéma et la validation des données.

Générez du SQL en quelques secondes
Collez votre CSV, obtenez une sortie SQL prête à l'emploi. Plus besoin de mettre les chaînes entre guillemets manuellement, d'échapper les apostrophes ou de compter les colonnes. La conversion s'exécute entièrement dans votre navigateur.
🔒
Vos données restent dans le navigateur
Votre CSV ne quitte jamais votre machine. L'analyse et la génération SQL se font entièrement côté client, ce qui signifie aucun envoi vers un serveur, aucune journalisation et aucun accès tiers à vos données.
🎯
Produisez une syntaxe SQL correcte
Les apostrophes dans les valeurs sont échappées en '' conformément à la norme SQL. Les noms de colonnes sont assainis pour former des identifiants valides. La sortie est syntaxiquement correcte pour PostgreSQL, MySQL et SQLite.
📋
Gérez n'importe quelle structure CSV
L'outil détecte automatiquement les délimiteurs (virgule, point-virgule, tabulation, pipe) et gère les champs entre guillemets contenant des virgules ou des sauts de ligne, conformément aux règles RFC 4180.

Cas d'usage du convertisseur CSV vers SQL

Alimentation de base de données
Convertissez un fichier CSV de fixtures en instructions INSERT pour des bases de données de développement ou de staging. Utile dans les pipelines CI où vous avez besoin de données initiales reproductibles sans ORM.
Migration de données
Déplacez des données exportées d'un système (CRM, tableur, application legacy) vers une nouvelle base de données relationnelle. Générez le SQL, vérifiez-le, puis exécutez-le dans une transaction.
Développement d'API backend
Peuplez rapidement une instance PostgreSQL ou MySQL locale avec des données de test issues d'un CSV. Plus rapide que l'écriture d'un script de migration pour un chargement unique.
QA et automatisation des tests
Générez du SQL à partir de fixtures CSV pour initialiser l'état de la base de données avant les tests d'intégration. Associez-le à un script de nettoyage pour réinitialiser la table entre les runs.
Préparation d'analyse de données
Chargez des jeux de données CSV dans SQLite pour des requêtes ad hoc. SQLite lit directement les instructions SQL INSERT, ce qui en fait un chemin rapide de l'export tableur aux données interrogeables.
Apprentissage de SQL
Les étudiants peuvent convertir des CSV d'exemple en SQL pour pratiquer les requêtes SELECT, JOIN et d'agrégation sur des données réalistes sans avoir à concevoir un schéma from scratch.

Référence des types de données SQL

Lors de la conversion CSV vers SQL, toutes les colonnes sont par défaut de type TEXT car CSV ne contient pas de métadonnées de type. Si vous connaissez les types de vos colonnes, vous pouvez remplacer TEXT dans la sortie CREATE TABLE. Ce tableau présente les types SQL les plus courants et leur utilisation.

TypeUtilisé pourNotes
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

Comparaison des dialectes SQL

La syntaxe SQL varie selon les moteurs de base de données. Les instructions INSERT générées utilisent du SQL standard qui fonctionne dans la plupart des systèmes, mais certaines fonctionnalités diffèrent. Ce tableau résume les différences les plus importantes lors de l'import de données CSV.

Fonctionnalité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 vs COPY : choisir une méthode d'import

Pour les jeux de données petits à moyens (moins de 10 000 lignes), les instructions INSERT fonctionnent bien et sont portables sur tous les systèmes SQL. Pour les imports volumineux, les bases de données proposent des commandes de chargement en masse qui contournent entièrement l'analyseur SQL.

INSERT INTO
SQL standard. Fonctionne partout. Chaque ligne est analysée comme une instruction SQL, ce qui génère une charge plus élevée pour les grands jeux de données. Prend en charge la logique conditionnelle (ON CONFLICT, ON DUPLICATE KEY). Idéal pour les données initiales, les petites migrations et les cas où vous avez besoin d'un contrôle ligne par ligne.
COPY / LOAD DATA
Chargeur en masse spécifique à chaque base de données. PostgreSQL utilise COPY, MySQL utilise LOAD DATA INFILE, SQLite utilise .import et SQL Server utilise BULK INSERT. Lit le CSV directement en contournant l'analyseur SQL. 10 à 100 fois plus rapide pour les fichiers volumineux (100 000+ lignes). Nécessite un accès au système de fichiers côté serveur ou client.

Exemples de code

Ces exemples montrent comment convertir du CSV en instructions SQL INSERT dans différents langages. Chacun gère l'échappement des apostrophes et l'assainissement des noms de colonnes.

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

Questions fréquentes

Comment les apostrophes dans les valeurs CSV sont-elles traitées dans la sortie SQL ?
Chaque apostrophe (') dans une valeur CSV est doublée en '' dans la sortie SQL. Il s'agit de la séquence d'échappement standard SQL. Par exemple, une valeur comme "O'Brien" devient 'O''Brien' dans l'instruction INSERT. Cela fonctionne dans PostgreSQL, MySQL, SQLite et SQL Server.
Puis-je convertir du CSV en SQL pour une base de données spécifique comme MySQL ou PostgreSQL ?
Les instructions INSERT générées utilisent une syntaxe SQL standard acceptée par MySQL et PostgreSQL. La principale différence concerne la délimitation des identifiants : PostgreSQL utilise les guillemets doubles, MySQL utilise les backticks. Pour les opérations INSERT de base, la sortie fonctionne dans les deux sans modification.
Que se passe-t-il si mon CSV n'a pas de ligne d'en-tête ?
Le convertisseur traite la première ligne comme les en-têtes de colonnes. Si votre CSV ne comporte pas d'en-têtes, ajoutez une ligne d'en-tête avant la conversion, sinon la première ligne de données deviendra les noms de colonnes dans l'instruction CREATE TABLE. La plupart des convertisseurs, dont celui-ci, nécessitent une ligne d'en-tête.
Y a-t-il une limite au nombre de lignes pour la conversion CSV vers SQL ?
La conversion s'exécutant dans votre navigateur, la limite pratique dépend de la mémoire de votre appareil. Les fichiers contenant des dizaines de milliers de lignes se convertissent sans problème. Pour les très grands fichiers (500 000+ lignes), envisagez d'utiliser la commande native COPY ou LOAD DATA de votre base de données plutôt que des instructions INSERT.
Pourquoi la sortie utilise-t-elle TEXT pour toutes les colonnes au lieu de INTEGER ou DATE ?
CSV est un format texte brut sans métadonnées de type. Le convertisseur utilise TEXT comme valeur par défaut sécurisée pour éviter une inférence de type incorrecte. Vous pouvez modifier les types de colonnes dans l'instruction CREATE TABLE générée après avoir examiné vos données. INTEGER pour les colonnes numériques et DATE pour les colonnes de dates sont des ajustements courants.
Comment gérer les fichiers CSV avec des points-virgules ou des tabulations comme délimiteurs ?
Cet outil détecte automatiquement le délimiteur en analysant la première ligne de votre CSV. Il vérifie les virgules, les points-virgules, les tabulations et les pipes, puis utilise celui qui apparaît le plus fréquemment. Les CSV au format européen utilisant des points-virgules fonctionnent sans aucune configuration.
Le SQL généré est-il protégé contre les injections si je l'exécute directement ?
La sortie échappe les apostrophes, ce qui évite les erreurs de syntaxe accidentelles. Toutefois, si vos données CSV proviennent d'une source non fiable, traitez le SQL généré comme toute entrée non validée. Vérifiez la sortie avant de l'exécuter sur une base de données de production. Pour les imports par programmation, les requêtes paramétrées sont toujours plus sûres que la concaténation de chaînes.