Давайте же наконец займёмся подготовкой таблиц для массовой загрузки данных из 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-файлы часто содержат сюрпризы. Прежде чем загружать данные, убедитесь, что они соответствуют структуре таблицы.
Как проверить данные?
Соответствие столбцов
Убедитесь, что количество столбцов в CSV совпадает с количеством столбцов в таблице. Например, если в таблице 5 столбцов, а в CSV-файле их 6, загрузка завершится ошибкой.Типы данных
Проверьте, чтобы данные в каждом столбце соответствовали ожидаемым типам. Например, в столбце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, включая обработку ошибок и работу с конфликтами.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
На Windows можно использовать простой скрипт на Python:Нафиг это все не нужно - используйте СОВРЕМЕННЫЙ синтаксис команды COPY - который правильно прочитает ваш CSV в любой кодировке, только укажите ему в какой кодировке он написан.