Как удалить дубликаты из CSV файла — 4 способа + сравнение
Почему дубликаты — это проблема
Представьте: вы получили базу контактов на 500 тысяч строк. Запускаете рассылку, а через час выясняется, что треть клиентов получили ваше сообщение дважды. Неловко? Ещё и бюджет утёк впустую.
Дубликаты в CSV-файлах — это как старые квитанции в кошельке: накапливаются незаметно, но мешают найти нужное и делают всё тяжелее. Откуда они берутся?
- Объединение баз — склеили несколько списков, забыли проверить пересечения
- Повторный экспорт — выгрузили данные из CRM дважды, добавили в один файл
- Ошибки парсинга — скрипт сработал несколько раз на одном источнике
- Человеческий фактор — добавили запись вручную, а она уже была
Результат один: файл раздут, расходы выше, эффективность ниже. В базе из миллиона номеров может быть 200—300 тысяч дублей. Это 20—30% лишних затрат на каждую операцию.
Как найти и удалить дубликаты
Способов много — от Excel до Python-скриптов. Разберём все по порядку: от простых (но с ограничениями) до профессиональных.
Excel и Google Sheets — простой, но ограниченный способ
Подходит для: небольших файлов (до 100 тысяч строк)
Время: 5—10 минут
Сложность: низкая
Откройте CSV в Excel, выделите столбец с номерами, перейдите в Данные → Удалить дубликаты. Excel найдёт повторяющиеся значения и удалит их, оставив только первое вхождение.
Ограничения:
- Excel зависает на файлах больше 500 тысяч строк
- Google Sheets ограничен 10 миллионами ячеек (примерно 1 млн строк)
- Не работает с номерами в разных форматах (8-xxx и +7-xxx)
Если у вас маленький файл и все номера записаны одинаково — Excel справится. Но для реальных баз нужно что-то мощнее.
Командная строка — sort и uniq
Подходит для: средних файлов (до 1 млн строк)
Время: 1—2 минуты
Сложность: средняя (нужны базовые навыки терминала)
Классическая связка sort | uniq удаляет дубликаты в текстовых файлах:
sort phones.csv | uniq > phones_unique.csv
Команда sort сортирует строки (одинаковые оказываются рядом), а uniq удаляет соседние дубликаты.
Ограничения:
- Не понимает форматы номеров — 89991234567 и 79991234567 останутся оба
- Требует сортировки (меняет порядок строк)
- На больших файлах (5+ млн строк) может упереться в память
Для технически подкованных — быстрый способ, но не универсальный.
Python-скрипт для гибкой дедупликации
Подходит для: любых размеров
Время: 10—15 минут на написание + время выполнения
Сложность: высокая (нужно знать Python)
Python справляется с большими данными и умеет нормализовать форматы:
import re
def normalize_phone(phone):
# Убираем всё, кроме цифр
digits = re.sub(r'\D', '', phone)
# Заменяем 8 на 7 для российских номеров
if len(digits) == 11 and digits[0] == '8':
digits = '7' + digits[1:]
return digits
unique_phones = set()
with open('phones.csv', 'r') as f:
for line in f:
phone = normalize_phone(line.strip())
if len(phone) == 11 and phone[0] == '7':
unique_phones.add(phone)
with open('phones_unique.csv', 'w') as f:
for phone in sorted(unique_phones):
f.write(phone + '\n')
print(f'Уникальных номеров: {len(unique_phones)}')
Этот скрипт:
- Читает файл построчно (не загружает всё в память сразу)
- Нормализует каждый номер (убирает пробелы, скобки, заменяет 8 на 7)
- Использует
set— структуру данных, которая автоматически игнорирует дубликаты - Записывает результат в новый файл
Ограничения:
- Нужно уметь программировать
- Скрипт придётся адаптировать под свои данные
- Нет прогресс-бара — непонятно, сколько ждать
Для разработчиков — отличный вариант, но не для всех.
Basalt — дедупликация одной кнопкой
Подходит для: любых размеров (проверено на 10+ млн строк)
Время: 30 секунд — 2 минуты
Сложность: нулевая
Basalt создан именно для работы с большими базами телефонных номеров. Дедупликация — одна из ключевых функций.
Как работает:
- Запустите Basalt, выберите функцию «Уникальные»
- Перетащите CSV-файл в окно (или выберите через кнопку «Обзор»)
- Укажите, куда сохранить результат
- Нажмите «Запустить»
Basalt автоматически:
- Распознаёт все форматы — +7, 8, 7, с пробелами, скобками, дефисами
- Нормализует к единому виду — 79991234567
- Удаляет дубликаты — использует эффективный алгоритм на основе Set
- Показывает статистику — сколько было, сколько уникальных, сколько дублей удалено
Программа работает полностью офлайн — файлы не покидают ваш компьютер. Никаких серверов, никаких утечек.
Пример результата:
Было: 2 345 678 номеров
Уникальных: 1 876 543
Дублей удалено: 469 135 (20%)
Вы сразу видите, насколько «загрязнена» была база. 20% дублей — это типичная ситуация для объединённых списков.
Производительность на больших файлах
Чем больше файл, тем важнее скорость обработки. Давайте сравним время работы разных инструментов:
| Размер файла | Excel | sort | uniq | Python | Basalt |
|---|---|---|---|---|
| 100 тыс. строк | ~30 сек | ~5 сек | ~3 сек | ~2 сек |
| 500 тыс. строк | зависает | ~25 сек | ~12 сек | ~8 сек |
| 1 млн строк | — | ~50 сек | ~25 сек | ~15 сек |
| 5 млн строк | — | ~4 мин | ~2 мин | ~1 мин |
| 10 млн строк | — | ошибка памяти | ~5 мин | ~2 мин |
На файлах до 100 тысяч строк разница незаметна — любой инструмент справится за секунды. Но на больших базах преимущество специализированных решений очевидно.
Basalt использует потоковую обработку: файл читается по частям, дубликаты отсеиваются на лету. Это позволяет обрабатывать файлы любого размера, не упираясь в оперативную память.
Практические советы по работе с дубликатами
1. Храните исходник
Перед удалением дублей сделайте копию оригинального файла. Звучит очевидно, но многие забывают — а потом выясняется, что удалились не те строки.
Basalt автоматически создаёт новый файл (не перезаписывает исходный), но всё равно: резервная копия никогда не помешает.
2. Проверяйте формат перед объединением
Если объединяете несколько баз, сначала приведите их к единому формату, потом склеивайте. Иначе один и тот же номер может оказаться в двух видах (79991234567 и 89991234567), и простая дедупликация их не поймает.
Basalt решает эту проблему автоматически, но если вы работаете с другими инструментами — следите за форматом.
3. Дедуплицируйте регулярно
Не ждите, пока база разрастётся до 10 миллионов строк с 30% дублей. Чистите данные после каждого пополнения:
- Получили новую выгрузку — прогнали дедупликацию
- Объединили два списка — удалили пересечения
- Импортировали данные из внешнего источника — проверили на дубли
Регулярная чистка занимает меньше времени, чем разовая генеральная уборка огромного файла.
4. Следите за статистикой
Когда удаляете дубликаты, обращайте внимание на процент повторов. Если он больше 30—40%, стоит задуматься:
- Возможно, вы склеиваете одни и те же базы несколько раз
- Возможно, источник данных выдаёт дубли (стоит поменять скрипт парсинга)
- Возможно, в рабочем процессе есть лишний шаг, который дублирует записи
Дубликаты — индикатор качества ваших процессов. Если их постоянно много — пора оптимизировать пайплайн.
5. Помните про регистр и пробелы
Для телефонных номеров это не критично, но если вы чистите другие CSV (email, имена, адреса) — учитывайте:
Ivan@mail.ruиivan@mail.ru— технически разные строкиМоскваиМосква(с пробелом в конце) — тоже
Хороший инструмент дедупликации должен нормализовать данные перед сравнением. Basalt делает это для номеров, но для других типов данных проверяйте настройки.
Чистые данные — эффективная работа
Удаление дубликатов — не просто техническая операция. Это инвестиция в качество ваших данных.
Чистая база:
- Экономит деньги — вы не платите за отправку одного SMS дважды
- Улучшает репутацию — клиенты не получают спам от вас по три раза
- Ускоряет работу — файл меньше, обработка быстрее
- Повышает точность аналитики — статистика считается по реальным контактам, а не по дублям
Выбирайте инструмент под свои задачи:
- Для разовой чистки маленького файла — Excel подойдёт
- Для автоматизации — Python-скрипт
- Для регулярной работы с большими базами — Basalt
Главное — не откладывайте. Чем раньше начнёте следить за качеством данных, тем меньше проблем потом.
И помните: дедупликация — это не стыдно. Дубликаты появляются у всех. Стыдно игнорировать их и терять деньги впустую.