CSV to SQL

Генерация SQL INSERT-запросов из CSV-данных

Попробовать пример

Входные данные CSV

SQL-вывод

Работает локально · Безопасно вставлять секреты
Здесь появится SQL…
Имя таблицы:

Что такое конвертация CSV в SQL?

Конвертация CSV в SQL преобразует значения, разделённые запятыми, в инструкции Structured Query Language, которые может выполнить реляционная база данных. Наиболее распространённый результат — пара команд: инструкция CREATE TABLE, определяющая столбцы, и одна или несколько инструкций INSERT INTO, заполняющих эти столбцы строками из CSV-файла.

CSV-файлы соответствуют спецификации RFC 4180. Каждая строка является записью, поля разделяются разделителем (обычно запятой), а поля, содержащие разделитель или переносы строк, заключаются в двойные кавычки. SQL, в свою очередь, является стандартным языком для управления данными в таких системах, как PostgreSQL, MySQL, SQLite и SQL Server. Преобразование между этими двумя форматами — одна из наиболее частых задач импорта данных в разработке программного обеспечения.

Полноценный конвертер CSV-в-SQL обрабатывает кавычки, экранирует одинарные кавычки внутри значений (удваивая их до '' согласно стандарту SQL), сопоставляет заголовки столбцов с допустимыми SQL-идентификаторами и при необходимости определяет типы данных. Помимо базового экранирования, хороший конвертер нормализует имена заголовков (заменяя пробелы и дефисы на знаки подчёркивания) и оборачивает вывод в блок транзакции, чтобы при сбое импорта выполнялся откат без сохранения частичных данных в таблице. Без конвертера ручное написание INSERT-инструкций даже для нескольких сотен строк — трудоёмкий и ненадёжный процесс.

Зачем использовать конвертер CSV в SQL?

Писать SQL INSERT-инструкции вручную из данных электронных таблиц утомительно и чревато синтаксическими ошибками. Конвертер автоматизирует рутинную работу, позволяя сосредоточиться на проектировании схемы и проверке данных.

Генерация SQL за секунды
Вставьте CSV — получите готовый к выполнению SQL. Не нужно вручную заключать строки в кавычки, экранировать апострофы или считать столбцы. Конвертация выполняется полностью в браузере.
🔒
Данные остаются в браузере
CSV-файл никогда не покидает ваш компьютер. Всё синтаксическое разбирание и генерация SQL происходят на стороне клиента — никакой загрузки на сервер, никаких журналов и никакого доступа третьих сторон к вашим данным.
🎯
Корректный SQL-синтаксис
Одинарные кавычки внутри значений экранируются как '' согласно стандарту SQL. Имена столбцов приводятся к допустимым идентификаторам. Результат синтаксически корректен для PostgreSQL, MySQL и SQLite.
📋
Поддержка любой структуры CSV
Инструмент автоматически определяет разделитель (запятая, точка с запятой, табуляция, вертикальная черта) и обрабатывает поля в кавычках со встроенными запятыми или переносами строк согласно правилам RFC 4180.

Сценарии использования CSV to SQL

Наполнение базы данных тестовыми данными
Преобразуйте CSV-файл с фикстурами в INSERT-инструкции для баз данных разработки или стейджинга. Удобно в CI-пайплайнах, где нужны повторяемые начальные данные без ORM.
Миграция данных
Перенесите данные, экспортированные из одной системы (CRM, таблица, устаревшее приложение), в новую реляционную базу данных. Сгенерируйте SQL, проверьте его, затем выполните в транзакции.
Разработка серверного API
Быстро заполните локальный экземпляр PostgreSQL или MySQL тестовыми данными из CSV. Быстрее, чем писать скрипт миграции, когда нужна разовая загрузка.
Тестирование и автоматизация QA
Генерируйте SQL из CSV-фикстур для настройки состояния базы данных перед интеграционными тестами. Используйте совместно со скриптом очистки для сброса таблицы между запусками тестов.
Подготовка к анализу данных
Загружайте CSV-наборы данных в SQLite для произвольных запросов. SQLite принимает SQL INSERT-инструкции напрямую — это быстрый путь от экспорта таблицы к данным, доступным для запросов.
Изучение SQL
Студенты могут конвертировать примеры CSV в SQL и практиковать запросы SELECT, JOIN и агрегирование на реалистичных данных без необходимости создавать схему с нуля.

Справочник по типам данных SQL

При конвертации CSV в SQL каждый столбец по умолчанию получает тип TEXT, поскольку в CSV нет метаданных о типах. Если вы знаете типы столбцов, замените TEXT в выводе CREATE TABLE. В таблице ниже приведены наиболее распространённые типы SQL и когда их применять.

ТипПрименяется дляПримечания
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

Сравнение диалектов SQL

Синтаксис SQL различается между движками баз данных. Сгенерированные INSERT-инструкции используют стандартный SQL, работающий в большинстве систем, однако некоторые возможности различаются. В таблице описаны ключевые отличия, важные при импорте CSV-данных.

Возможность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: выбор метода импорта

Для небольших и средних наборов данных (до 10 000 строк) INSERT-инструкции работают хорошо и совместимы с любой SQL-базой данных. Для больших импортов базы данных предоставляют команды массовой загрузки, минующие SQL-парсер.

INSERT INTO
Стандартный SQL. Работает везде. Каждая строка обрабатывается как SQL-инструкция, поэтому накладные расходы выше при больших наборах данных. Поддерживает условную логику (ON CONFLICT, ON DUPLICATE KEY). Оптимален для начальных данных, небольших миграций и случаев, когда нужен контроль на уровне строк.
COPY / LOAD DATA
Специализированный загрузчик для конкретной базы данных. PostgreSQL использует COPY, MySQL — LOAD DATA INFILE, SQLite — .import, SQL Server — BULK INSERT. Читает CSV напрямую, минуя SQL-парсер. В 10–100 раз быстрее для больших файлов (100 тыс.+ строк). Требует доступа к файловой системе на сервере или клиенте.

Примеры кода

Примеры ниже показывают, как конвертировать CSV в SQL INSERT-инструкции на разных языках программирования. Каждый из них обрабатывает экранирование одинарных кавычек и нормализацию имён столбцов.

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

Часто задаваемые вопросы

Как обрабатываются одинарные кавычки в значениях CSV при формировании SQL?
Каждая одинарная кавычка (') в значении CSV удваивается до '' в SQL-выводе. Это стандартная escape-последовательность SQL. Например, значение "O'Brien" становится 'O''Brien' в INSERT-инструкции. Это работает в PostgreSQL, MySQL, SQLite и SQL Server.
Можно ли конвертировать CSV в SQL для конкретной базы данных — MySQL или PostgreSQL?
Сгенерированные INSERT-инструкции используют стандартный SQL-синтаксис, который принимают и MySQL, и PostgreSQL. Основное различие — экранирование идентификаторов: PostgreSQL использует двойные кавычки, MySQL — обратные кавычки. Для базовых операций INSERT вывод работает в обоих без изменений.
Что произойдёт, если в CSV нет строки заголовков?
Конвертер считает первую строку заголовками столбцов. Если ваш CSV не содержит заголовков, добавьте строку заголовков перед конвертацией — иначе первая строка данных станет именами столбцов в инструкции CREATE TABLE. Большинство конвертеров, включая этот, требуют наличия строки заголовков.
Есть ли ограничение по количеству строк при конвертации CSV в SQL?
Поскольку конвертация выполняется в браузере, практический лимит определяется объёмом памяти вашего устройства. Файлы с десятками тысяч строк конвертируются без проблем. Для очень больших файлов (500 тыс.+ строк) рекомендуется использовать нативные команды COPY или LOAD DATA вашей базы данных вместо INSERT-инструкций.
Почему в выводе используется TEXT для всех столбцов вместо INTEGER или DATE?
CSV — это текстовый формат без метаданных о типах. Конвертер использует TEXT как безопасное значение по умолчанию, чтобы избежать некорректного определения типов. Вы можете изменить типы столбцов в сгенерированной инструкции CREATE TABLE после проверки данных. Типичные замены: INTEGER для числовых столбцов и DATE для столбцов с датами.
Как работать с CSV-файлами, где разделителями служат точка с запятой или табуляция?
Инструмент автоматически определяет разделитель, анализируя первую строку CSV. Проверяются запятые, точки с запятой, табуляции и символы вертикальной черты — используется тот, что встречается чаще всего. CSV европейского формата с точками с запятой работают без какой-либо настройки.
Защищён ли сгенерированный SQL от инъекций при прямом выполнении?
В выводе экранируются одинарные кавычки, что предотвращает случайные синтаксические ошибки. Однако если ваши CSV-данные поступают из ненадёжного источника, относитесь к сгенерированному SQL так же, как к любым непроверенным данным. Проверяйте вывод перед выполнением на производственной базе данных. Для программных импортов параметризованные запросы всегда безопаснее, чем конкатенация строк.