CSV in SQL

Genera istruzioni SQL INSERT da dati CSV

Prova un esempio

Input CSV

Output SQL

Esegue in locale · Sicuro per incollare segreti
L'SQL apparirà qui…
Nome tabella:

Cos'è la conversione da CSV a SQL?

La conversione da CSV a SQL trasforma valori separati da virgola in istruzioni Structured Query Language che un database relazionale può eseguire. L'output più comune è una coppia: un'istruzione CREATE TABLE che definisce le colonne e una o più istruzioni INSERT INTO che popolano quelle colonne con le righe del file CSV.

I file CSV seguono la specifica RFC 4180. Ogni riga è un record, i campi sono separati da un delimitatore (di solito una virgola) e i campi che contengono il delimitatore o ritorni a capo sono racchiusi tra virgolette doppie. SQL, invece, è il linguaggio standard per la gestione dei dati in sistemi come PostgreSQL, MySQL, SQLite e SQL Server. La conversione tra questi due formati è una delle operazioni di importazione dati più frequenti nello sviluppo software.

Un convertitore CSV-to-SQL corretto gestisce la delimitazione, esegue l'escape delle virgolette singole nei valori (raddoppiandole in '' secondo lo standard SQL), mappa le intestazioni delle colonne in identificatori SQL validi e può facoltativamente dedurre i tipi di dato. Oltre all'escape di base, un buon convertitore normalizza i nomi delle intestazioni (sostituendo spazi e trattini con underscore) e racchiude l'output in un blocco di transazione, in modo che un errore di importazione esegua il rollback in modo pulito invece di lasciare dati parziali nella tabella. Senza un convertitore, scrivere a mano istruzioni INSERT anche per poche centinaia di righe è lento e soggetto a errori.

Perché usare un convertitore CSV in SQL?

Scrivere manualmente istruzioni SQL INSERT da dati di un foglio di calcolo è tedioso e porta facilmente a errori di sintassi. Un convertitore automatizza le parti ripetitive in modo da potersi concentrare sulla progettazione dello schema e sulla validazione dei dati.

Genera SQL in pochi secondi
Incolla il tuo CSV e ottieni un output SQL pronto all'uso. Nessuna necessità di racchiudere manualmente le stringhe tra virgolette, eseguire l'escape degli apostrofi o contare le colonne. La conversione avviene interamente nel browser.
🔒
I dati restano nel browser
Il tuo CSV non lascia mai il tuo computer. Il parsing e la generazione SQL avvengono lato client, il che significa nessun caricamento su server, nessun log e nessun accesso di terze parti al tuo dataset.
🎯
Sintassi SQL corretta
Le virgolette singole nei valori vengono trasformate in '' secondo lo standard SQL. I nomi delle colonne vengono normalizzati in identificatori validi. L'output è sintatticamente valido per PostgreSQL, MySQL e SQLite.
📋
Gestisce qualsiasi struttura CSV
Lo strumento rileva automaticamente il delimitatore (virgola, punto e virgola, tab, pipe) e gestisce i campi racchiusi tra virgolette con virgole o ritorni a capo incorporati, seguendo le regole RFC 4180.

Casi d'uso di CSV in SQL

Seeding del database
Converti un file CSV di fixture in istruzioni INSERT per database di sviluppo o staging. Utile nelle pipeline CI in cui sono necessari dati seed ripetibili senza un ORM.
Migrazione dei dati
Sposta i dati esportati da un sistema (CRM, foglio di calcolo, applicazione legacy) in un nuovo database relazionale. Genera l'SQL, verificalo e poi eseguilo in una transazione.
Sviluppo API backend
Popola rapidamente un'istanza locale di PostgreSQL o MySQL con dati di test da un CSV. Più veloce rispetto alla scrittura di uno script di migrazione quando è necessario un caricamento una tantum.
QA e automazione dei test
Genera SQL da fixture CSV in formato di test per impostare lo stato del database prima dei test di integrazione. Abbinalo a uno script di teardown per ripristinare la tabella tra un'esecuzione e l'altra.
Preparazione all'analisi dei dati
Carica dataset CSV in SQLite per interrogazioni ad hoc. SQLite legge direttamente le istruzioni SQL INSERT, rendendo questo un percorso rapido dall'esportazione di un foglio di calcolo a dati interrogabili.
Apprendimento di SQL
Gli studenti possono convertire CSV di esempio in SQL per esercitarsi con query SELECT, JOIN e aggregate su dati realistici, senza dover impostare uno schema da zero.

Riferimento ai tipi di dato SQL

Quando si converte da CSV a SQL, ogni colonna viene impostata per impostazione predefinita su TEXT perché il CSV non ha metadati di tipo. Se conosci i tipi di colonna, puoi sostituire TEXT nell'output CREATE TABLE. Questa tabella mostra i tipi SQL più comuni e quando usarli.

TipoUtilizzato perNote
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

Confronto tra dialetti SQL

La sintassi SQL varia tra i motori di database. Le istruzioni INSERT generate usano SQL standard che funziona nella maggior parte dei sistemi, ma alcune caratteristiche differiscono. Questa tabella riassume le differenze più rilevanti quando si importano dati CSV.

CaratteristicaPostgreSQLMySQLSQLiteSQL 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: scegliere il metodo di importazione

Per dataset di piccole e medie dimensioni (meno di 10.000 righe), le istruzioni INSERT funzionano bene e sono portabili su tutti i database SQL. Per importazioni di grandi dimensioni, i database forniscono comandi di caricamento in blocco che bypassano interamente il parser SQL.

INSERT INTO
SQL standard. Funziona ovunque. Ogni riga viene analizzata come un'istruzione SQL, quindi il costo è maggiore per dataset di grandi dimensioni. Supporta la logica condizionale (ON CONFLICT, ON DUPLICATE KEY). Ideale per seed data, migrazioni di piccole dimensioni e casi in cui è necessario il controllo a livello di riga.
COPY / LOAD DATA
Caricatore bulk specifico del database. PostgreSQL usa COPY, MySQL usa LOAD DATA INFILE, SQLite usa .import e SQL Server usa BULK INSERT. Legge il CSV direttamente, bypassando il parser SQL. Da 10 a 100 volte più veloce per file di grandi dimensioni (100K+ righe). Richiede accesso al file system sul server o sul client.

Esempi di codice

Questi esempi mostrano come convertire CSV in istruzioni SQL INSERT in diversi linguaggi. Ognuno gestisce l'escape delle virgolette singole e la normalizzazione dei nomi delle colonne.

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

Domande frequenti

Come vengono gestite le virgolette singole nei valori CSV nell'output SQL?
Ogni virgoletta singola (') in un valore CSV viene raddoppiata in '' nell'output SQL. Questa è la sequenza di escape standard SQL. Ad esempio, un valore come "O'Brien" diventa 'O''Brien' nell'istruzione INSERT. Questo funziona in PostgreSQL, MySQL, SQLite e SQL Server.
Posso convertire CSV in SQL per un database specifico come MySQL o PostgreSQL?
Le istruzioni INSERT generate usano la sintassi SQL standard accettata sia da MySQL che da PostgreSQL. La differenza principale riguarda la delimitazione degli identificatori: PostgreSQL usa le virgolette doppie, MySQL usa i backtick. Per le operazioni INSERT di base, l'output funziona in entrambi senza modifiche.
Cosa succede se il mio CSV non ha una riga di intestazione?
Il convertitore tratta la prima riga come intestazioni di colonna. Se il tuo CSV non ha intestazioni, aggiungi una riga di intestazione prima di convertire, altrimenti la prima riga di dati diventerà i nomi delle colonne nell'istruzione CREATE TABLE. La maggior parte dei convertitori, incluso questo, richiede una riga di intestazione.
C'è un limite di righe per la conversione da CSV a SQL?
Poiché la conversione avviene nel browser, il limite pratico dipende dalla memoria del dispositivo. I file con decine di migliaia di righe vengono convertiti senza problemi. Per file molto grandi (500K+ righe), considera l'uso del comando nativo COPY o LOAD DATA del database invece delle istruzioni INSERT.
Perché l'output usa TEXT per tutte le colonne invece di INTEGER o DATE?
Il CSV è un formato di testo normale senza metadati di tipo. Il convertitore usa TEXT come valore predefinito sicuro per evitare inferenze di tipo errate. Puoi modificare i tipi di colonna nell'istruzione CREATE TABLE generata dopo aver verificato i tuoi dati. INTEGER per le colonne numeriche e DATE per le colonne con date sono adattamenti comuni.
Come gestire i file CSV con punto e virgola o tab come delimitatori?
Questo strumento rileva automaticamente il delimitatore analizzando la prima riga del CSV. Controlla la presenza di virgole, punti e virgola, tab e pipe, quindi usa quello che appare più frequentemente. I CSV in formato europeo che usano il punto e virgola funzionano senza alcuna modifica alla configurazione.
L'SQL generato è sicuro rispetto all'injection se lo eseguo direttamente?
L'output esegue l'escape delle virgolette singole, il che previene errori di sintassi accidentali. Tuttavia, se i dati CSV provengono da una fonte non attendibile, tratta l'SQL generato come qualsiasi input non validato. Verifica l'output prima di eseguirlo su un database di produzione. Per le importazioni programmatiche, le query parametrizzate sono sempre più sicure della concatenazione di stringhe.