Как разделить CSV файл на несколько частей: 4 проверенных способа

Алексей Петров · · 7 мин чтения

База из 500 тысяч телефонных номеров. Вам нужно отправить её через email-рассылку, но сервис принимает максимум 50 тысяч записей за раз. Или вы работаете с CRM-системой, которая зависает на файлах больше 100 МБ. Знакомая ситуация?

Разделение больших CSV-файлов на части — частая задача при работе с базами данных. В этой статье разберём четыре способа: от ручного редактирования до специализированных инструментов. Каждый метод проверен на практике, с замером времени выполнения и оценкой трудозатрат.

Зачем делить CSV-файлы

Причины разделения файлов на практике:

Типичный сценарий: есть база на 2,5 млн номеров (файл 85 МБ), нужно разбить на чанки по 100 тысяч для загрузки в CRM. Посмотрим, как это сделать.

Ручное разделение в текстовом редакторе

Самый простой, но наименее эффективный способ — открыть файл в текстовом редакторе и вручную скопировать нужные строки.

Как это делается

  1. Откройте CSV в текстовом редакторе (Notepad++, Sublime Text, VS Code)
  2. Выделите нужное количество строк (например, первые 10 000)
  3. Скопируйте их в новый файл
  4. Сохраните как part_1.csv
  5. Повторите для остальных частей

Плюсы и минусы

Плюсы Минусы
Не требует дополнительных инструментов Не работает с файлами больше 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

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

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/TXT файлами без необходимости программирования.

Как разделить файл в Базальте

  1. Откройте раздел «Разделить файл»
  2. Выберите исходный CSV или TXT файл
  3. Укажите размер чанка (например, 10 000 строк)
  4. Нажмите «Разделить файл»
  5. Получите ZIP-архив с пронумерованными частями

Что происходит под капотом

Базальт не просто режет файл механически, а:

Производительность Базальта

Тест на реальной базе — 2,5 млн номеров (файл 85 МБ), разделение на чанки по 100 тысяч:

Метод Время Клики мышью Дополнительные шаги
Ручной (текстовый редактор) ~40 минут ~75 Подсчёт строк, создание файлов
split (Linux) 8 секунд 0 Переименование файлов
Python-скрипт 22 секунды 0 Написание и запуск скрипта
Базальт 12 секунд 3 Нет

Преимущества Базальта

Как выбрать размер чанка

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

Сценарий Рекомендуемый размер Почему
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, в других языках — аналогичные библиотеки.

Практические советы

  1. Всегда делайте резервную копию исходного файла перед разделением — ошибки случаются.
  2. Проверяйте первый и последний файлы после разделения — убедитесь, что количество строк совпадает с ожидаемым.
  3. Используйте порядковые номера в названиях файлов (часть_001.csv, часть_002.csv) — так файлы будут правильно сортироваться в проводнике.
  4. Документируйте параметры разделения — запишите размер чанка и дату операции в отдельный текстовый файл. Через месяц вы забудете детали.
  5. Если файл больше 2 ГБ, не пытайтесь открыть его в Excel или текстовом редакторе — используйте командную строку или специализированные инструменты.

Что выбрать для разных задач

Разовая задача, маленький файл (до 50 тысяч строк) — используйте текстовый редактор. Быстрее, чем устанавливать дополнительные инструменты.

Работаете в Linux/macOS и файлы в стандартном формате — используйте split. Это самый быстрый способ для чистых CSV.

Нужна дополнительная обработка или сложная логика — напишите Python-скрипт. Полный контроль над процессом.

Регулярная работа с базами номеров — используйте Базальт. Удобный интерфейс, автоматический парсинг, ZIP-архив на выходе, работает офлайн.

В большинстве случаев для работы с телефонными базами оптимальный вариант — специализированный инструмент типа Базальта. Он решает 90% задач за три клика, экономит время и снижает вероятность ошибок. Для остальных 10% — есть командная строка и Python.