CSV a SQL

Genera sentencias SQL INSERT a partir de datos CSV

Prueba un ejemplo

Entrada CSV

Salida SQL

Se ejecuta localmente · Es seguro pegar secretos
El SQL aparecerá aquí…
Nombre de tabla:

¿Qué es la conversión de CSV a SQL?

La conversión de CSV a SQL transforma valores separados por comas en sentencias del Lenguaje de Consulta Estructurado que una base de datos relacional puede ejecutar. El resultado más habitual es un par de sentencias: CREATE TABLE, que define las columnas, y una o varias sentencias INSERT INTO, que rellenan esas columnas con las filas del archivo CSV.

Los archivos CSV siguen la especificación RFC 4180. Cada línea es un registro, los campos están separados por un delimitador (normalmente una coma) y los campos que contienen el delimitador o saltos de línea van entre comillas dobles. SQL, por su parte, es el lenguaje estándar para gestionar datos en sistemas como PostgreSQL, MySQL, SQLite y SQL Server. Convertir entre estos dos formatos es una de las tareas de importación de datos más frecuentes en el desarrollo de software.

Un convertidor CSV a SQL adecuado gestiona las comillas, escapa las comillas simples dentro de los valores (duplicándolas como '' según el estándar SQL), asigna las cabeceras de columna a identificadores SQL válidos y puede inferir tipos de datos de forma opcional. Más allá del escape básico, un buen convertidor normaliza los nombres de cabecera (reemplazando espacios y guiones por guiones bajos) y envuelve la salida en un bloque de transacción, de modo que un fallo en la importación deshace los cambios sin dejar datos parciales en la tabla. Sin un convertidor, escribir sentencias INSERT a mano para varios cientos de filas es lento y propenso a errores.

¿Por qué usar un convertidor de CSV a SQL?

Escribir sentencias SQL INSERT a mano a partir de datos de una hoja de cálculo es tedioso y propenso a errores de sintaxis. Un convertidor automatiza las partes repetitivas para que puedas concentrarte en el diseño del esquema y la validación de datos.

Genera SQL en segundos
Pega tu CSV y obtén SQL listo para ejecutar. Sin necesidad de entrecomillar cadenas manualmente, escapar apóstrofes ni contar columnas. La conversión se ejecuta íntegramente en tu navegador.
🔒
Los datos no salen de tu navegador
Tu CSV nunca abandona tu equipo. Todo el análisis y la generación de SQL ocurre en el lado del cliente, lo que significa que no hay subida a ningún servidor, no hay registros y ningún tercero accede a tus datos.
🎯
Produce sintaxis SQL correcta
Las comillas simples dentro de los valores se escapan como '' según el estándar SQL. Los nombres de columna se sanean para que sean identificadores válidos. La salida es sintácticamente válida para PostgreSQL, MySQL y SQLite.
📋
Admite cualquier estructura CSV
La herramienta detecta automáticamente el delimitador (coma, punto y coma, tabulador, barra vertical) y gestiona campos entrecomillados con comas o saltos de línea incrustados, siguiendo las reglas del RFC 4180.

Casos de uso de CSV a SQL

Poblado de bases de datos
Convierte un archivo CSV de datos de prueba en sentencias INSERT para bases de datos de desarrollo o de staging. Útil en pipelines de CI donde necesitas datos reproducibles sin un ORM.
Migración de datos
Mueve datos exportados de un sistema (CRM, hoja de cálculo, aplicación heredada) a una nueva base de datos relacional. Genera el SQL, revísalo y ejecútalo dentro de una transacción.
Desarrollo de API backend
Llena rápidamente una instancia local de PostgreSQL o MySQL con datos de prueba desde un CSV. Más rápido que escribir un script de migración cuando solo necesitas una carga puntual.
QA y automatización de pruebas
Genera SQL a partir de archivos CSV de prueba para establecer el estado de la base de datos antes de los tests de integración. Combínalo con un script de limpieza para restaurar la tabla entre ejecuciones.
Preparación de análisis de datos
Carga conjuntos de datos CSV en SQLite para consultas ad-hoc. SQLite lee directamente las sentencias SQL INSERT, lo que permite pasar rápidamente de una exportación de hoja de cálculo a datos consultables.
Aprendizaje de SQL
Los estudiantes pueden convertir CSVs de ejemplo en SQL para practicar SELECT, JOIN y consultas de agregación sobre datos realistas sin necesidad de definir un esquema desde cero.

Referencia de tipos de datos SQL

Al convertir CSV a SQL, cada columna tiene TEXT como tipo predeterminado porque CSV no tiene metadatos de tipo. Si conoces los tipos de las columnas, puedes reemplazar TEXT en la salida de CREATE TABLE. Esta tabla muestra los tipos SQL más comunes y cuándo usar cada uno.

TipoUsado paraNotas
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

Comparación de dialectos SQL

La sintaxis SQL varía según el motor de base de datos. Las sentencias INSERT generadas usan SQL estándar que funciona en la mayoría de los sistemas, pero ciertas características difieren. Esta tabla resume las diferencias más relevantes al importar datos CSV.

CaracterísticaPostgreSQLMySQLSQLiteSQL 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: elegir un método de importación

Para conjuntos de datos pequeños o medianos (menos de 10.000 filas), las sentencias INSERT funcionan bien y son portables entre cualquier base de datos SQL. Para importaciones grandes, las bases de datos ofrecen comandos de carga masiva que omiten el analizador SQL por completo.

INSERT INTO
SQL estándar. Funciona en cualquier sistema. Cada fila se analiza como una sentencia SQL, por lo que el coste es mayor para conjuntos de datos grandes. Admite lógica condicional (ON CONFLICT, ON DUPLICATE KEY). Ideal para datos de inicialización, migraciones pequeñas y casos en los que necesitas control a nivel de fila.
COPY / LOAD DATA
Cargador masivo específico de cada base de datos. PostgreSQL usa COPY, MySQL usa LOAD DATA INFILE, SQLite usa .import y SQL Server usa BULK INSERT. Lee el CSV directamente, omitiendo el analizador SQL. Entre 10 y 100 veces más rápido para archivos grandes (100K+ filas). Requiere acceso al sistema de archivos en el servidor o en el cliente.

Ejemplos de código

Estos ejemplos muestran cómo convertir CSV a sentencias SQL INSERT en distintos lenguajes. Cada uno gestiona el escape de comillas simples y el saneamiento de nombres de columna.

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

Preguntas frecuentes

¿Cómo se gestionan las comillas simples de los valores CSV en la salida SQL?
Cada comilla simple (') en un valor CSV se duplica como '' en la salida SQL. Esta es la secuencia de escape estándar de SQL. Por ejemplo, un valor como "O'Brien" se convierte en 'O''Brien' en la sentencia INSERT. Esto funciona en PostgreSQL, MySQL, SQLite y SQL Server.
¿Puedo convertir CSV a SQL para una base de datos concreta como MySQL o PostgreSQL?
Las sentencias INSERT generadas usan sintaxis SQL estándar que tanto MySQL como PostgreSQL aceptan. La principal diferencia es la forma de entrecomillar identificadores: PostgreSQL usa comillas dobles y MySQL usa comillas invertidas. Para operaciones INSERT básicas, la salida funciona en ambos sin modificaciones.
¿Qué ocurre si mi CSV no tiene fila de cabecera?
El convertidor trata la primera fila como cabeceras de columna. Si tu CSV no tiene cabeceras, añade una fila de cabecera antes de convertir; de lo contrario, la primera fila de datos se convertirá en los nombres de columna del CREATE TABLE. La mayoría de los convertidores, incluido este, requieren una fila de cabecera.
¿Hay algún límite de filas para la conversión de CSV a SQL?
Como la conversión se ejecuta en tu navegador, el límite práctico depende de la memoria de tu dispositivo. Los archivos con decenas de miles de filas se convierten sin problemas. Para archivos muy grandes (500K+ filas), considera usar el comando nativo COPY o LOAD DATA de tu base de datos en lugar de sentencias INSERT.
¿Por qué la salida usa TEXT para todas las columnas en lugar de INTEGER o DATE?
CSV es un formato de texto plano sin metadatos de tipo. El convertidor usa TEXT como valor predeterminado seguro para evitar inferencias de tipo incorrectas. Puedes cambiar los tipos de columna en la sentencia CREATE TABLE generada después de revisar tus datos. INTEGER para columnas numéricas y DATE para columnas de fecha son los ajustes más habituales.
¿Cómo debo gestionar archivos CSV con punto y coma o tabuladores como delimitadores?
Esta herramienta detecta automáticamente el delimitador analizando la primera fila de tu CSV. Comprueba si hay comas, puntos y coma, tabuladores y barras verticales, y usa el que aparece con más frecuencia. Los CSV en formato europeo que usan punto y coma funcionan sin ningún cambio de configuración.
¿Es el SQL generado seguro frente a inyecciones si lo ejecuto directamente?
La salida escapa las comillas simples, lo que evita errores de sintaxis accidentales. Sin embargo, si los datos de tu CSV provienen de una fuente no confiable, trata el SQL generado de la misma manera que tratarías cualquier entrada no validada. Revisa la salida antes de ejecutarla contra una base de datos en producción. Para importaciones programáticas, las consultas parametrizadas siempre son más seguras que la concatenación de cadenas.