Номер генерируется согласно шаблону. Пример шаблона:
"661:r1:rr1:d00:ca". Шаблон может состоять из любого количества блоков (частей, разделенных двоеточиями), формат блока определяет метод обработки. В данной версии скрипта может быть пять методов обработки - копирование, сборка блока из случайных чисел, сборка блока из случайных чисел с ограничением, последовательное инкрементирование и создание контрольного числа.
Копирование. Это просто перенос блока в будущий номер. Копирование применяется к блокам, которые полностью состоят из чисел, в случае с приведенным примером это будет блок "661". Этот кусок будет копироваться в каждый генерируемый номер.
Сборка блока из случайных чисел. Это действие будет произведено с блоком, начинающимся с литеры "r". Число, находящееся после "r", указывает количество разрядов случайного числа. Блок из примера заставит скрипт создать случайное однозначное число.
Сборка блока из случайных чисел с ограничением. Аналогично предыдущему, за исключением того, что цифры, указанные в таблице
Restriction = {9} будут пропускаться. В данном случае это цифра "9". Если надо запретить ещё какие-то цифры, их нужно вписать в таблицу через запятую (
Restriction = {9, 2, 6}).
Последовательное инкрементирование. Этот метод запускается, если блок начинается с литеры "d". Число после литеры будет вставлено в первый генерируемый номер, в следующий - это число + 1 и т.д., до тех пор, пока не будет набрано нужное количество номеров или не будет достигнут предел для указанного числа разрядов (в данном примере последним допустимым числом будет 99). Если достигнут предел, а заданное количество номеров не сгенерировано, скрипт выдаст сообщение об ошибке.
Создание контрольного числа. Этот метод запускается, если блок начинается с литеры "c". Следующая литера - тип метода. В данный момент это "а" - единственный на данный момент метод. Суть его работы - реализация вот этого алгоритма:
Восьмая цифра - контрольная.
Контрольным числом - является число, дополняющее под разрядную сумму до ближайшего целого десятка. Если, под разрядная сумма кратна 10, то контрольный знак равен 0. В примере контрольным знаком будет 8.
Номер вагона 7 4 8 5 4 6 8
Множитель 2 1 2 1 2 1 2
Произведение 14 4 16 5 8 6 16
Сумма 1 + 4 + 4 + 1 + 6 + 5 + 8 + 6 + 1 + 6 = 42
Обработке подвергнется собранный на текущем этапе номер, то есть, в приведенном примере контрольное число будет рассчитано на номер 606+4 случайных цифры. Если после этого блока в шаблоне есть ещё какие-нибудь, они учитываться не будут.
После того, как номер сгенерировался, он проходит сверку на дубликаты. Сначала происходит сверка с уже существующими номерами, вписанными в файл
ReconciliationFile.csv, потом - проверятся, нет ли совпадения с номерами, созданными в текущей сессии. Если совпадений не обнаружено, номер вписывается в выходной файл. Если же есть совпадение, отмечается провал генерации, номер не сохраняется.
Скрипт будет пытаться генерировать номера до тех пор, пока не будет достигнуто указанное количество номеров либо пока не будет выполнен лимит попыток.
Когда генерирование будет закончено, результат работы будет сохранен в файле numbers.csv и дописан в файл ReconciliationFile.csv.