JavaRush /Курсы /SQL SELF /Подготовка таблиц для загрузки данных из CSV

Подготовка таблиц для загрузки данных из CSV

SQL SELF
23 уровень , 2 лекция
Открыта

Давайте же наконец займёмся подготовкой таблиц для массовой загрузки данных из CSV-файлов. Если вы думаете: "А зачем вообще нужно готовить таблицу? Что там сложного?", то вам ещё многое предстоит узнать о реальном мире. Никакой файл не бывает "идеальным". Ложка дёгтя всегда найдётся — будь то дубли, лишние пробелы, ошибки в типах данных или просто несовпадение структуры.

Давайте разберём, как правильно подготовить базу, чтобы CSV-файл загрузился без эксцессов.

Прежде чем загружать CSV-файл, определите, как именно данные будут храниться в базе. Это значит, что сначала нужно создать таблицу с подходящей структурой.

Пример: загрузка данных о студентах

Предположим, у нас есть CSV-файл students.csv с информацией о студентах. Его содержимое выглядит так:

id,name,age,email,major
1,Alex,20,alex@example.com,Computer Science
2,Maria,21,maria@example.com,Mathematics
3,Otto,19,otto@example.com,Physics

На его основе создадим таблицу:

CREATE TABLE students (
    id SERIAL PRIMARY KEY,       -- Уникальный идентификатор студента
    name VARCHAR(100) NOT NULL,  -- Имя студента (строка длиной до 100 символов)
    age INT CHECK (age > 0),     -- Возраст студента (должен быть больше 0)
    email VARCHAR(100) UNIQUE,   -- Уникальный email
    major VARCHAR(100)           -- Основная специальность
);
  • id SERIAL PRIMARY KEY: Мы добавили основной ключ для уникальной идентификации строк. Если в вашем CSV-файле уже есть уникальные идентификаторы, используйте столбец id из файла.
  • name VARCHAR(100) NOT NULL: Имя студента должно быть указано, и длина имени ограничена 100 символами.
  • age INT CHECK (age > 0): Возраст должен быть числом, и мы добавляем проверку, чтобы он всегда был больше 0.
  • email VARCHAR(100) UNIQUE: Email должен быть уникальным, чтобы избежать дублирующихся записей.
  • major VARCHAR(100): Указывает на основную специальность студента. В данном случае ограничений нет.

Ваши таблицы должны быть продуманно структурированы, чтобы соответствовать вашим данным и одновременно защищать от некорректных данных. Это уменьшит количество ошибок при загрузке.

Проверка данных перед загрузкой

CSV-файлы часто содержат сюрпризы. Прежде чем загружать данные, убедитесь, что они соответствуют структуре таблицы.

Как проверить данные?

  1. Соответствие столбцов
    Убедитесь, что количество столбцов в CSV совпадает с количеством столбцов в таблице. Например, если в таблице 5 столбцов, а в CSV-файле их 6, загрузка завершится ошибкой.

  2. Типы данных
    Проверьте, чтобы данные в каждом столбце соответствовали ожидаемым типам. Например, в столбце age должны быть только целые числа.

Инструменты для валидации

Excel или Google Sheets. Откройте файл в табличном редакторе и убедитесь, что в вашем документе нет пустых строк или ячеек с некорректными данными.

Python. Используйте библиотеку pandas для проверки типов данных:

import pandas as pd

# Читаем CSV
df = pd.read_csv('students.csv')

# Проверяем данные
print(df.dtypes)  # Вывод типов данных для каждого столбца
print(df.isnull().sum())  # Проверка пустых значений

Очистка данных перед загрузкой

Чаще всего данные из внешних источников требуют очистки. В противном случае вы рискуете столкнуться с ошибками при загрузке.

Типичные проблемы с CSV-файлами

Пустые строки или столбцы
Если в строке пропущено значение в обязательном столбце (NOT NULL), это вызовет ошибку.

Пример некорректных данных:

id,name,age,email,major
1,Alex,20,alexey@example.com,Computer Science
2,Maria,,maria@example.com,Mathematics

Решение: Замените пустые значения на допустимые. Например, замените пустой age на NULL.

Лишние пробелы
Пробелы в начале или в конце строк могут вызвать проблемы. Например, "Alex" и "Alex" будут считаться разными значениями.

Решение на Python: удалите лишние пробелы.

df = df.apply(lambda x: x.str.strip() if x.dtype == "object" else x)

Некорректные символы или кодировка
Если файл содержит специальные символы, несовместимые с базой данных, загрузка может завершиться неудачей.

Пример: Используйте приложение iconv для преобразования кодировки:

iconv -f WINDOWS-1251 -t UTF-8 students.csv > students_utf8.csv

Очистка данных: пример с Python

import pandas as pd

# Читаем файл
df = pd.read_csv('students.csv')

# Очищаем данные
df['name'] = df['name'].str.strip()  # Удаляем пробелы
df['email'] = df['email'].str.lower()  # Приводим email к нижнему регистру
df['age'] = df['age'].fillna(0)  # Заполняем пустые значения для возраста
df['age'] = df['age'].astype(int)  # Конвертируем возраст в целое число

# Сохраняем изменения в новый файл
df.to_csv('cleaned_students.csv', index=False)

Всегда проверяйте данные перед загрузкой. Помните: хороший программист экономит свое время, ловя проблемы заранее!

Полезный чек-лист для подготовки таблиц и данных

Перед началом работы с CSV проверьте:

  • Структура таблицы соответствует данным (столбцы, типы данных, ограничения).
  • CSV-файл не содержит пустых строк, лишних пробелов или некорректных символов.
  • Кодировка файла совместима с PostgreSQL (лучше всего использовать UTF-8).
  • Вы используете инструменты для анализа и очистки данных (например, Python, Excel).

Теперь вы готовы загружать данные из CSV! Но прежде чем мы это сделаем, убедитесь, что ваша таблица правильно структурирована и данные очищены. На следующей лекции мы продолжим разбирать процесс загрузки данных в PostgreSQL, включая обработку ошибок и работу с конфликтами.

2
Задача
SQL SELF, 23 уровень, 2 лекция
Недоступна
Создание таблицы для загрузки данных
Создание таблицы для загрузки данных
Комментарии (2)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Анатолий Уровень 27
8 февраля 2026
❤️
Slevin Уровень 34
15 сентября 2025
Пример: Используйте приложение iconv для преобразования кодировки: Это Linux-приложение, о чем уместно бы было сообщить. На Windows можно использовать простой скрипт на Python:

# encoding_converter.py

input_file = "input.csv"
output_file = "output.csv"

# Открываем исходный файл в кодировке CP1251
with open(input_file, "r", encoding="cp1251") as f_in:
    data = f_in.read()

# Записываем в новый файл в UTF-8
with open(output_file, "w", encoding="utf-8") as f_out:
    f_out.write(data)

print(f"Файл {input_file} успешно преобразован в {output_file} с UTF-8")

Нафиг это все не нужно - используйте СОВРЕМЕННЫЙ синтаксис команды COPY - который правильно прочитает ваш CSV в любой кодировке, только укажите ему в какой кодировке он написан.