Как разделить CSV файл на несколько частей: 4 проверенных способа
База из 500 тысяч телефонных номеров. Вам нужно отправить её через email-рассылку, но сервис принимает максимум 50 тысяч записей за раз. Или вы работаете с CRM-системой, которая зависает на файлах больше 100 МБ. Знакомая ситуация?
Разделение больших CSV-файлов на части — частая задача при работе с базами данных. В этой статье разберём четыре способа: от ручного редактирования до специализированных инструментов. Каждый метод проверен на практике, с замером времени выполнения и оценкой трудозатрат.
Зачем делить CSV-файлы
Причины разделения файлов на практике:
- Ограничения платформ — email-сервисы (SendPulse, Unisender) принимают до 50–100 тысяч контактов за загрузку
- Производительность — Excel зависает на файлах больше 1 млн строк, Google Sheets — на 200 тысячах
- Параллельная обработка — разделяете базу между несколькими операторами или скриптами
- Бэкапы и версионирование — Git плохо работает с файлами больше 100 МБ
- API-лимиты — сторонние сервисы часто ограничивают размер запроса
Типичный сценарий: есть база на 2,5 млн номеров (файл 85 МБ), нужно разбить на чанки по 100 тысяч для загрузки в CRM. Посмотрим, как это сделать.
Ручное разделение в текстовом редакторе
Самый простой, но наименее эффективный способ — открыть файл в текстовом редакторе и вручную скопировать нужные строки.
Как это делается
- Откройте CSV в текстовом редакторе (Notepad++, Sublime Text, VS Code)
- Выделите нужное количество строк (например, первые 10 000)
- Скопируйте их в новый файл
- Сохраните как
part_1.csv - Повторите для остальных частей
Плюсы и минусы
| Плюсы | Минусы |
|---|---|
| Не требует дополнительных инструментов | Не работает с файлами больше 500 МБ |
| Полный контроль над процессом | Высокий риск ошибки при подсчёте строк |
| Подходит для разовых задач | На 100 тысяч строк уходит 5–10 минут |
Вердикт: годится только для маленьких файлов (до 50 тысяч строк) и разовых задач. Для регулярной работы — слишком медленно и неудобно.
Командная строка (Linux/macOS)
Если вы работаете в Unix-подобной системе, утилита split решает задачу одной командой.
Использование split
# Разделить файл на части по 10 000 строк
split -l 10000 база.csv часть_
# Результат: часть_aa, часть_ab, часть_ac...
# Добавить расширение .csv к каждой части
for file in часть_*; do
mv "$file" "$file.csv"
done
Параметры команды:
-l 10000— количество строк в каждом файлебаза.csv— исходный файлчасть_— префикс для выходных файлов
PowerShell для Windows
# Разделить файл на части по 10 000 строк
$lines = Get-Content база.csv
$chunkSize = 10000
$chunkNumber = 1
for ($i = 0; $i -lt $lines.Count; $i += $chunkSize) {
$chunk = $lines[$i..([Math]::Min($i + $chunkSize - 1, $lines.Count - 1))]
$chunk | Set-Content "часть_$chunkNumber.csv"
$chunkNumber++
}
Производительность
Тест на файле 500 тысяч строк (50 МБ), разделение на части по 50 тысяч:
| Метод | Время выполнения | Использование памяти |
|---|---|---|
split (Linux) |
2,3 секунды | ~5 МБ |
| PowerShell | 18 секунд | ~120 МБ |
Проблема: эти инструменты делят файл механически, не учитывая содержимое. Если в вашем CSV есть заголовки, мусорные строки или нестандартный формат номеров — придётся дополнительно чистить результат.
Python-скрипт
Для более гибкой обработки можно написать скрипт на Python. Это даёт полный контроль над тем, что попадает в каждый файл.
Простой вариант
import csv
def split_csv(input_file, chunk_size):
with open(input_file, 'r', encoding='utf-8') as f:
reader = csv.reader(f)
chunk_num = 1
chunk = []
for row in reader:
chunk.append(row)
if len(chunk) >= chunk_size:
with open(f'часть_{chunk_num}.csv', 'w', encoding='utf-8', newline='') as out:
writer = csv.writer(out)
writer.writerows(chunk)
chunk_num += 1
chunk = []
# Записываем остаток
if chunk:
with open(f'часть_{chunk_num}.csv', 'w', encoding='utf-8', newline='') as out:
writer = csv.writer(out)
writer.writerows(chunk)
split_csv('база.csv', 10000)
Вариант с парсингом номеров
Если в файле не только номера, а смешанные данные, можно добавить парсинг:
import re
def extract_phones(text):
# Паттерн для российских номеров
pattern = r'(?:\+7|8|7)?[\s\-]?(?:\(?\d{3}\)?[\s\-]?)?\d{3}[\s\-]?\d{2}[\s\-]?\d{2}'
phones = re.findall(pattern, text)
return [re.sub(r'[\s\-\(\)]', '', p) for p in phones]
def split_with_parsing(input_file, chunk_size):
with open(input_file, 'r', encoding='utf-8') as f:
lines = f.readlines()
all_phones = []
for line in lines:
phones = extract_phones(line)
all_phones.extend(phones)
# Разбиваем на чанки
for i in range(0, len(all_phones), chunk_size):
chunk = all_phones[i:i + chunk_size]
with open(f'часть_{i // chunk_size + 1}.csv', 'w', encoding='utf-8') as out:
out.write('\n'.join(chunk))
split_with_parsing('база.csv', 10000)
Когда использовать Python
Подходит, если:
- Нужна дополнительная обработка (валидация номеров, удаление дублей)
- Файлы в нестандартном формате (не чистый CSV)
- Требуется логирование или статистика обработки
Не подходит, если:
- Файл больше 2 ГБ (Python загружает всё в память)
- Нужна максимальная скорость (Python в 5–10 раз медленнее нативных утилит)
- Задача разовая, и писать скрипт дольше, чем выполнить её вручную
Базальт — офлайн-инструмент
Если вы регулярно работаете с базами номеров, удобнее использовать специализированный инструмент. Базальт — десктопное приложение для работы с CSV/TXT файлами без необходимости программирования.
Как разделить файл в Базальте
- Откройте раздел «Разделить файл»
- Выберите исходный CSV или TXT файл
- Укажите размер чанка (например, 10 000 строк)
- Нажмите «Разделить файл»
- Получите ZIP-архив с пронумерованными частями
Что происходит под капотом
Базальт не просто режет файл механически, а:
- Парсит номера — автоматически извлекает телефоны из любого формата (с пробелами, скобками, префиксами +7/8)
- Нормализует — приводит к единому виду (79XXXXXXXXX)
- Упаковывает в ZIP — все части сразу в одном архиве, не нужно создавать папки вручную
- Показывает статистику — сколько номеров обработано, сколько файлов создано
Производительность Базальта
Тест на реальной базе — 2,5 млн номеров (файл 85 МБ), разделение на чанки по 100 тысяч:
| Метод | Время | Клики мышью | Дополнительные шаги |
|---|---|---|---|
| Ручной (текстовый редактор) | ~40 минут | ~75 | Подсчёт строк, создание файлов |
split (Linux) |
8 секунд | 0 | Переименование файлов |
| Python-скрипт | 22 секунды | 0 | Написание и запуск скрипта |
| Базальт | 12 секунд | 3 | Нет |
Преимущества Базальта
- Работает офлайн — не нужен интернет, данные не уходят на сторонние серверы
- Обрабатывает любые форматы — парсит номера даже из «грязных» файлов с мусором
- ZIP-архив на выходе — удобно отправлять или хранить
- История операций — можно вернуться к предыдущим файлам
- Быстрый повторный запуск — параметры сохраняются
Как выбрать размер чанка
Оптимальный размер части зависит от того, куда вы будете загружать файлы.
| Сценарий | Рекомендуемый размер | Почему |
|---|---|---|
| Email-рассылка (SendPulse, Unisender) | 50 000 строк | Лимит большинства платформ |
| Загрузка в CRM (amoCRM, Битрикс24) | 10 000–50 000 строк | Баланс скорости и стабильности |
| Обработка в Excel | 100 000 строк | Excel начинает тормозить после 500 тысяч |
| Параллельная обработка операторами | 5 000–20 000 строк | Удобный объём для ручной работы |
| API-запросы | 1 000–10 000 строк | Зависит от лимитов конкретного API |
Правило: если не знаете точный лимит — начните с 10 тысяч строк. Это универсальный размер, который принимают 95% сервисов.
Частые проблемы при разделении файлов
Путаница с кодировками
При разделении файла в Windows часто возникает путаница с кодировками. Исходный файл может быть в UTF-8, а программа сохраняет части в Windows-1251.
Решение: всегда явно указывайте UTF-8 при сохранении. В Python это параметр encoding='utf-8', в текстовых редакторах — выпадающий список при сохранении файла.
Потерянные заголовки CSV
Если в исходном CSV есть заголовок (первая строка с названиями колонок), он попадёт только в первую часть. Остальные части будут без заголовков.
Решение: либо копируйте заголовок вручную в каждый файл, либо используйте инструменты, которые это делают автоматически (например, Базальт в режиме «Сохранить заголовки»).
Переносы строк внутри значений
Если в CSV есть текстовые поля с переносами строк (например, адреса или комментарии в кавычках), механическое разделение по количеству строк сломает структуру файла.
Решение: используйте инструменты, которые парсят CSV правильно (учитывают кавычки и экранирование). В Python это модуль csv, в других языках — аналогичные библиотеки.
Практические советы
- Всегда делайте резервную копию исходного файла перед разделением — ошибки случаются.
- Проверяйте первый и последний файлы после разделения — убедитесь, что количество строк совпадает с ожидаемым.
- Используйте порядковые номера в названиях файлов (
часть_001.csv,часть_002.csv) — так файлы будут правильно сортироваться в проводнике. - Документируйте параметры разделения — запишите размер чанка и дату операции в отдельный текстовый файл. Через месяц вы забудете детали.
- Если файл больше 2 ГБ, не пытайтесь открыть его в Excel или текстовом редакторе — используйте командную строку или специализированные инструменты.
Что выбрать для разных задач
Разовая задача, маленький файл (до 50 тысяч строк) — используйте текстовый редактор. Быстрее, чем устанавливать дополнительные инструменты.
Работаете в Linux/macOS и файлы в стандартном формате — используйте split. Это самый быстрый способ для чистых CSV.
Нужна дополнительная обработка или сложная логика — напишите Python-скрипт. Полный контроль над процессом.
Регулярная работа с базами номеров — используйте Базальт. Удобный интерфейс, автоматический парсинг, ZIP-архив на выходе, работает офлайн.
В большинстве случаев для работы с телефонными базами оптимальный вариант — специализированный инструмент типа Базальта. Он решает 90% задач за три клика, экономит время и снижает вероятность ошибок. Для остальных 10% — есть командная строка и Python.