Как перемешать строки в CSV файле — 4 способа рандомизации
Зачем перемешивать строки в CSV
Представьте: вы подготовили базу для холодных звонков. Номера отсортированы по дате добавления — первые 10 тысяч из одного региона, следующие 10 тысяч из другого. Если обзванивать по порядку, первый менеджер получит только Москву, второй — только Питер. Несправедливо и неэффективно.
Или другой сценарий: вы проводите A/B-тест рассылки. Если первая половина базы получит вариант A, а вторая — вариант B, результаты будут искажены: вдруг первая половина — это старые контакты, а вторая — свежие?
Перемешивание (shuffle) нужно, чтобы:
- Равномерно распределить нагрузку — каждый менеджер получает случайную выборку из всей базы
- Избежать последовательных паттернов — если номера отсортированы по оператору или региону, это может повлиять на результаты
- Обеспечить честность A/B-тестов — случайное распределение гарантирует сопоставимость групп
- Снизить предвзятость — люди склонны выбирать первые элементы списка, перемешивание убирает эту проблему
Excel и функция RAND()
Подходит для: небольших файлов (до 100 тысяч строк)
Время: 5 минут
Сложность: низкая
Excel умеет генерировать случайные числа — на этом и построим перемешивание.
Алгоритм:
- Откройте CSV в Excel
- Добавьте вспомогательный столбец справа (например, столбец B)
- В первой ячейке столбца введите формулу
=RAND() - Протащите формулу вниз на все строки — каждая строка получит случайное число от 0 до 1
- Выделите оба столбца (данные + случайные числа)
- Перейдите в
Данные → Сортировка - Отсортируйте по столбцу со случайными числами (по возрастанию или убыванию — неважно)
- Удалите вспомогательный столбец
- Сохраните результат
Ограничения:
- Excel начинает тормозить на файлах больше 200—300 тысяч строк
- Функция
RAND()пересчитывается при каждом изменении — если случайно что-то отредактируете, порядок собьётся - Не подходит для автоматизации
Для разовой задачи с маленьким файлом — вполне рабочий вариант.
Командная строка — shuf и sort -R
Подходит для: средних и больших файлов
Время: несколько секунд
Сложность: средняя (нужны базовые навыки терминала)
В Linux и macOS есть утилита shuf, которая перемешивает строки:
shuf phones.csv > phones_shuffled.csv
Всё. Одна команда — и файл перемешан.
Если shuf недоступна (например, на старых версиях macOS), можно использовать sort с флагом -R (random):
sort -R phones.csv > phones_shuffled.csv
Ограничения:
sort -Rработает медленнее, чемshuf- На Windows придётся ставить WSL или Git Bash
- Не подходит для тех, кто не работает с терминалом
Для технически подкованных пользователей — быстрый и надёжный способ.
Python и random.shuffle()
Подходит для: автоматизации и больших файлов
Время: 10 минут на написание скрипта
Сложность: средняя (нужно знать Python)
import random
with open('phones.csv', 'r') as f:
lines = f.readlines()
# Перемешиваем список строк
random.shuffle(lines)
with open('phones_shuffled.csv', 'w') as f:
f.writelines(lines)
print(f'Перемешано {len(lines)} строк')
Этот скрипт загружает весь файл в память, перемешивает и записывает обратно. Работает быстро на файлах до нескольких миллионов строк.
Для файлов больше RAM: используйте командную строку (shuf) или Basalt — они работают потоково и не упираются в память.
Важно: Python использует алгоритм Fisher-Yates для random.shuffle() — это гарантирует равномерное распределение. Каждая перестановка имеет одинаковую вероятность.
Ограничения:
- Требует знания Python
- Нужно писать и запускать скрипт (не всегда удобно)
Basalt — перемешивание за 30 секунд
Подходит для: любых размеров
Время: 30 секунд
Сложность: нулевая
Basalt делает перемешивание максимально простым — без кода, без командной строки, без Excel-формул.
Инструкция:
- Запустите Basalt, выберите функцию «Перемешать»
- Перетащите CSV-файл в окно (или выберите через кнопку)
- Укажите, куда сохранить результат
- Нажмите «Запустить»
Программа автоматически:
- Извлекает все телефонные номера из файла
- Применяет алгоритм Fisher-Yates (истинная случайность)
- Записывает результат в новый файл
- Показывает статистику: сколько строк перемешано
Что такое Fisher-Yates?
Это классический алгоритм случайного перемешивания. Работает так:
- Берём последний элемент списка
- Меняем его местами со случайным элементом (включая себя)
- Переходим к предпоследнему, повторяем
- Продолжаем, пока не дойдём до начала
Почему Fisher-Yates? Потому что он гарантирует равномерное распределение: каждая возможная перестановка имеет одинаковую вероятность. Более простые алгоритмы (например, «поменять каждый элемент с случайным») могут давать предвзятые результаты.
Basalt использует Fisher-Yates — вы получаете математически корректное перемешивание.
Как проверить качество перемешивания
Не все методы перемешивания одинаково хороши. Вот как проверить, что ваш файл действительно случаен:
Визуальная проверка
Откройте первые 50 строк исходного и перемешанного файла. Если перемешивание сработало, порядок должен радикально отличаться. Если видите, что большие блоки остались на месте — что-то пошло не так.
Проверка на паттерны
Если исходный файл был отсортирован (например, по региону или дате), проверьте, что после перемешивания эти паттерны разрушены:
- Номера с одним кодом оператора должны быть разбросаны по файлу
- Если была временная последовательность — она должна исчезнуть
Статистический тест (для параноиков)
Можно написать скрипт, который проверяет, что каждый элемент переместился. Если 90%+ элементов остались на своих местах — перемешивание фиктивное.
original = open('phones.csv').readlines()
shuffled = open('phones_shuffled.csv').readlines()
same_position = sum(1 for i in range(len(original)) if original[i] == shuffled[i])
percentage = (same_position / len(original)) * 100
print(f'На своих местах: {percentage:.1f}%')
# Должно быть близко к 0% (для больших файлов может быть 0.01—0.1%)
Если больше 5% элементов остались на местах — перемешивание недостаточно случайное.
Практические советы
1. Не перемешивайте файлы с заголовками
Если в первой строке CSV находится заголовок (phone,name,region), а вы перемешаете весь файл, заголовок окажется где-то в середине.
Решение:
- В Excel: не включайте первую строку в сортировку
- В Python: пропускайте первую строку при чтении
- В Basalt: заголовки игнорируются автоматически (программа извлекает только номера)
2. Проверьте, что количество строк не изменилось
После перемешивания подсчитайте строки в исходном и результирующем файле:
wc -l phones.csv phones_shuffled.csv
Числа должны совпадать. Если результат короче — что-то потерялось.
3. Сохраняйте оригинал
Перемешивание необратимо. Если позже выяснится, что исходный порядок был важен (например, там была хронология), восстановить его будет невозможно.
Basalt всегда создаёт новый файл, не трогая оригинал. Но если вы пишете свой скрипт — не забудьте сделать то же самое.
4. Используйте seed для воспроизводимости
Если вам нужно, чтобы перемешивание было случайным, но воспроизводимым (например, для отладки), используйте seed:
import random
random.seed(42) # Любое число
random.shuffle(lines)
Теперь при каждом запуске с seed(42) вы получите одинаковое перемешивание. Для production убирайте seed — нужна настоящая случайность.
Когда перемешивание не нужно
Не всегда случайный порядок — это хорошо:
- Если данные уже случайны — дополнительное перемешивание ничего не даст
- Если порядок семантически важен — например, это лог событий или временная последовательность
- Если нужна сортировка — иногда данные специально упорядочены (по приоритету, алфавиту), и ломать это нет смысла
Перемешивайте, только если есть причина. Случайность ради случайности — пустая трата времени.
Истинная случайность — проще, чем кажется
Перемешивание строк в CSV — базовая операция, которая решает реальные задачи: справедливое распределение нагрузки, честные A/B-тесты, разрушение нежелательных паттернов.
Главное:
- Для маленьких файлов подойдёт Excel (функция
RAND()) - Для командной строки —
shufилиsort -R - Для автоматизации — Python с
random.shuffle() - Для быстрой работы без кода — Basalt
Все современные инструменты используют Fisher-Yates или его аналоги — это гарантирует математически корректное перемешивание.
Не перемешивайте вручную (сортируя строки наугад) — человек плохо умеет генерировать случайность. Доверьте это компьютеру.