CSV para SQL

Gere comandos SQL INSERT a partir de dados CSV

Experimente um exemplo

Entrada CSV

Saída SQL

Roda localmente · Seguro para colar segredos
O SQL aparecerá aqui…
Nome da tabela:

O que é a Conversão de CSV para SQL?

A conversão de CSV para SQL transforma valores separados por vírgula em comandos Structured Query Language que um banco de dados relacional pode executar. O resultado mais comum é um par: um comando CREATE TABLE que define as colunas, e um ou mais comandos INSERT INTO que populam essas colunas com as linhas do arquivo CSV.

Arquivos CSV seguem a especificação RFC 4180. Cada linha é um registro, os campos são separados por um delimitador (geralmente uma vírgula), e campos que contêm o delimitador ou quebras de linha são envolvidos por aspas duplas. SQL, por sua vez, é a linguagem padrão para gerenciar dados em sistemas como PostgreSQL, MySQL, SQLite e SQL Server. A conversão entre esses dois formatos é uma das tarefas de importação de dados mais frequentes no desenvolvimento de software.

Um conversor de CSV para SQL adequado trata as aspas, escapa aspas simples dentro dos valores (duplicando-as para '' conforme o padrão SQL), mapeia os cabeçalhos das colunas para identificadores SQL válidos e pode opcionalmente inferir tipos de dados. Além do escape básico, um bom conversor normaliza os nomes dos cabeçalhos (substituindo espaços e hífens por underscores) e envolve o resultado em um bloco de transação, para que uma falha na importação desfaça tudo de forma limpa em vez de deixar dados parciais na tabela. Sem um conversor, escrever manualmente comandos INSERT para algumas centenas de linhas é lento e sujeito a erros.

Por que usar um Conversor de CSV para SQL?

Escrever comandos SQL INSERT à mão a partir de dados de planilha é tedioso e propenso a erros de sintaxe. Um conversor automatiza as partes repetitivas para que você possa se concentrar no design do esquema e na validação dos dados.

Gere SQL em segundos
Cole seu CSV e obtenha SQL pronto para executar. Sem necessidade de colocar strings entre aspas manualmente, escapar apóstrofos ou contar colunas. A conversão roda inteiramente no seu navegador.
🔒
Mantenha os dados no seu navegador
Seu CSV nunca sai da sua máquina. Todo o parsing e a geração de SQL acontecem no lado do cliente, o que significa nenhum upload para servidor, nenhum registro em log e nenhum acesso de terceiros ao seu conjunto de dados.
🎯
Produza sintaxe SQL correta
Aspas simples dentro dos valores são escapadas como '' conforme o padrão SQL. Os nomes das colunas são sanitizados para identificadores válidos. O resultado é sintaticamente válido para PostgreSQL, MySQL e SQLite.
📋
Lide com qualquer estrutura CSV
A ferramenta detecta automaticamente os delimitadores (vírgula, ponto e vírgula, tabulação, pipe) e trata campos entre aspas com vírgulas ou quebras de linha embutidas, seguindo as regras da RFC 4180.

Casos de Uso do CSV para SQL

Seed de Banco de Dados
Converta um arquivo CSV de fixtures em comandos INSERT para bancos de dados de desenvolvimento ou staging. Útil em pipelines de CI onde você precisa de dados de seed repetíveis sem um ORM.
Migração de Dados
Mova dados exportados de um sistema (CRM, planilha, aplicação legada) para um novo banco de dados relacional. Gere o SQL, revise-o e execute-o em uma transação.
Desenvolvimento de API Backend
Popule rapidamente uma instância local de PostgreSQL ou MySQL com dados de teste a partir de um CSV. Mais rápido do que escrever um script de migração quando você precisa de uma carga única.
QA e Automação de Testes
Gere SQL a partir de fixtures CSV para configurar o estado do banco de dados antes dos testes de integração. Combine com um script de teardown para redefinir a tabela entre as execuções de teste.
Preparação para Análise de Dados
Carregue conjuntos de dados CSV no SQLite para consultas ad-hoc. O SQLite lê comandos SQL INSERT diretamente, tornando isso um caminho rápido do export de planilha para dados consultáveis.
Aprendizado de SQL
Estudantes podem converter CSVs de exemplo em SQL para praticar consultas SELECT, JOIN e agregação em dados realistas sem precisar configurar um esquema do zero.

Referência de Tipos de Dados SQL

Ao converter CSV para SQL, cada coluna é definida como TEXT por padrão porque o CSV não possui metadados de tipo. Se você souber os tipos das colunas, pode substituir TEXT no resultado do CREATE TABLE. Esta tabela mostra os tipos SQL mais comuns e quando usar cada um.

TipoUsado ParaObservações
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

Comparação de Dialetos SQL

A sintaxe SQL varia entre os mecanismos de banco de dados. Os comandos INSERT gerados usam SQL padrão que funciona na maioria dos sistemas, mas certos recursos diferem. Esta tabela resume as diferenças mais relevantes ao importar dados CSV.

RecursoPostgreSQLMySQLSQLiteSQL 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: Escolhendo um Método de Importação

Para conjuntos de dados pequenos a médios (menos de 10.000 linhas), os comandos INSERT funcionam bem e são portáveis em qualquer banco de dados SQL. Para importações grandes, os bancos de dados fornecem comandos de carregamento em massa que ignoram completamente o parser SQL.

INSERT INTO
SQL padrão. Funciona em qualquer lugar. Cada linha é interpretada como um comando SQL, portanto o overhead é maior para conjuntos de dados grandes. Suporta lógica condicional (ON CONFLICT, ON DUPLICATE KEY). Melhor para seed de dados, migrações pequenas e casos em que você precisa de controle por linha.
COPY / LOAD DATA
Carregador em massa específico de banco de dados. PostgreSQL usa COPY, MySQL usa LOAD DATA INFILE, SQLite usa .import e SQL Server usa BULK INSERT. Lê o CSV diretamente, ignorando o parser SQL. De 10 a 100 vezes mais rápido para arquivos grandes (100K+ linhas). Requer acesso ao sistema de arquivos no servidor ou no cliente.

Exemplos de Código

Estes exemplos mostram como converter CSV em comandos SQL INSERT em diferentes linguagens. Cada um trata o escape de aspas simples e a sanitização dos nomes das colunas.

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

Perguntas Frequentes

Como as aspas simples em valores CSV são tratadas na saída SQL?
Cada aspas simples (') em um valor CSV é duplicada para '' na saída SQL. Esta é a sequência de escape padrão do SQL. Por exemplo, um valor como "O'Brien" se torna 'O''Brien' no comando INSERT. Isso funciona em PostgreSQL, MySQL, SQLite e SQL Server.
Posso converter CSV para SQL para um banco de dados específico como MySQL ou PostgreSQL?
Os comandos INSERT gerados usam sintaxe SQL padrão aceita tanto pelo MySQL quanto pelo PostgreSQL. A principal diferença é a forma de delimitar identificadores: PostgreSQL usa aspas duplas, MySQL usa backticks. Para operações básicas de INSERT, o resultado funciona em ambos sem modificação.
O que acontece se meu CSV não tiver linha de cabeçalho?
O conversor trata a primeira linha como cabeçalhos de coluna. Se o seu CSV não tiver cabeçalhos, adicione uma linha de cabeçalho antes de converter, ou a primeira linha de dados se tornará os nomes das colunas no comando CREATE TABLE. A maioria dos conversores, incluindo este, requer uma linha de cabeçalho.
Há um limite de linhas para a conversão de CSV para SQL?
Como a conversão roda no seu navegador, o limite prático depende da memória do seu dispositivo. Arquivos com dezenas de milhares de linhas são convertidos sem problemas. Para arquivos muito grandes (500K+ linhas), considere usar o comando nativo COPY ou LOAD DATA do banco de dados em vez de comandos INSERT.
Por que o resultado usa TEXT para todas as colunas em vez de INTEGER ou DATE?
CSV é um formato de texto simples sem metadados de tipo. O conversor usa TEXT como padrão seguro para evitar inferência incorreta de tipos. Você pode alterar os tipos das colunas no comando CREATE TABLE gerado após revisar seus dados. INTEGER para colunas numéricas e DATE para colunas de data são ajustes comuns.
Como devo lidar com arquivos CSV que usam ponto e vírgula ou tabulação como delimitadores?
Esta ferramenta detecta automaticamente o delimitador analisando a primeira linha do seu CSV. Ela verifica vírgulas, pontos e vírgulas, tabulações e pipes, e usa o que aparecer com maior frequência. CSVs no formato europeu que usam ponto e vírgula funcionam sem nenhuma alteração de configuração.
O SQL gerado é seguro contra injeção se eu executá-lo diretamente?
O resultado escapa as aspas simples, o que previne erros de sintaxe acidentais. No entanto, se os dados do seu CSV vierem de uma fonte não confiável, trate o SQL gerado da mesma forma que trataria qualquer entrada não validada. Revise o resultado antes de executá-lo em um banco de dados de produção. Para importações programáticas, consultas parametrizadas são sempre mais seguras do que concatenação de strings.