Как удалить дубликаты из CSV файла — 4 способа + сравнение

Марина Козлова · · 6 мин чтения

Почему дубликаты — это проблема

Представьте: вы получили базу контактов на 500 тысяч строк. Запускаете рассылку, а через час выясняется, что треть клиентов получили ваше сообщение дважды. Неловко? Ещё и бюджет утёк впустую.

Дубликаты в CSV-файлах — это как старые квитанции в кошельке: накапливаются незаметно, но мешают найти нужное и делают всё тяжелее. Откуда они берутся?

Результат один: файл раздут, расходы выше, эффективность ниже. В базе из миллиона номеров может быть 200—300 тысяч дублей. Это 20—30% лишних затрат на каждую операцию.

Как найти и удалить дубликаты

Способов много — от Excel до Python-скриптов. Разберём все по порядку: от простых (но с ограничениями) до профессиональных.

Excel и Google Sheets — простой, но ограниченный способ

Подходит для: небольших файлов (до 100 тысяч строк)
Время: 5—10 минут
Сложность: низкая

Откройте CSV в Excel, выделите столбец с номерами, перейдите в Данные → Удалить дубликаты. Excel найдёт повторяющиеся значения и удалит их, оставив только первое вхождение.

Ограничения:

Если у вас маленький файл и все номера записаны одинаково — Excel справится. Но для реальных баз нужно что-то мощнее.

Командная строка — sort и uniq

Подходит для: средних файлов (до 1 млн строк)
Время: 1—2 минуты
Сложность: средняя (нужны базовые навыки терминала)

Классическая связка sort | uniq удаляет дубликаты в текстовых файлах:

sort phones.csv | uniq > phones_unique.csv

Команда sort сортирует строки (одинаковые оказываются рядом), а uniq удаляет соседние дубликаты.

Ограничения:

Для технически подкованных — быстрый способ, но не универсальный.

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)}')

Этот скрипт:

  1. Читает файл построчно (не загружает всё в память сразу)
  2. Нормализует каждый номер (убирает пробелы, скобки, заменяет 8 на 7)
  3. Использует set — структуру данных, которая автоматически игнорирует дубликаты
  4. Записывает результат в новый файл

Ограничения:

Для разработчиков — отличный вариант, но не для всех.

Basalt — дедупликация одной кнопкой

Подходит для: любых размеров (проверено на 10+ млн строк)
Время: 30 секунд — 2 минуты
Сложность: нулевая

Basalt создан именно для работы с большими базами телефонных номеров. Дедупликация — одна из ключевых функций.

Как работает:

  1. Запустите Basalt, выберите функцию «Уникальные»
  2. Перетащите CSV-файл в окно (или выберите через кнопку «Обзор»)
  3. Укажите, куда сохранить результат
  4. Нажмите «Запустить»

Basalt автоматически:

Программа работает полностью офлайн — файлы не покидают ваш компьютер. Никаких серверов, никаких утечек.

Пример результата:

Было: 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, имена, адреса) — учитывайте:

Хороший инструмент дедупликации должен нормализовать данные перед сравнением. Basalt делает это для номеров, но для других типов данных проверяйте настройки.

Чистые данные — эффективная работа

Удаление дубликатов — не просто техническая операция. Это инвестиция в качество ваших данных.

Чистая база:

Выбирайте инструмент под свои задачи:

Главное — не откладывайте. Чем раньше начнёте следить за качеством данных, тем меньше проблем потом.

И помните: дедупликация — это не стыдно. Дубликаты появляются у всех. Стыдно игнорировать их и терять деньги впустую.