За каждое совпадение в массиве увеличивается на единицу - PullRequest
0 голосов
/ 27 февраля 2019

Я работаю над назначением идентификаторов пользователей, беря первые пять символов фамилии, первые три символа имени, затем добавляя 001 к концу этой строки.Таким образом, человеку по имени Джо Доу будет присвоено имя «DOE__JO_000» в качестве его идентификатора пользователя.

Если критерии имени этого человека меньше трех символов в имени и / или меньше пяти символов в фамилии,Я добавляю «_» до тех пор, пока он не удовлетворяет этим критериям.

Прямо сейчас я могу найти совпадения и создать критерии именования, но если существует более одного совпадения, оно увеличивается только один раз, если имеется несколько совпадений.

Мне нужно проверить, существует ли в проекте идентификатор, назначенный пользователю, и увеличивает ли он новый идентификатор на 1?

Например, если есть пользователь по имени Джо Доу, которыйЯ уже назначил идентификатор "DOE__JO_000" в проекте, затем я хотел бы добавить 1 к другому Джо Доу, дав ему идентификатор "DOE__JO_001".Однако, если есть третий Джо Доу, он будет увеличиваться до "DOE__JO_002".

Вот мой код:

$exIDArray = @("DOE__JO_000","DOE_JO_001","SMITHNAN000","ZAHN_THO000")

$lastFive = "Doe";
$lnFive = $lastFive.toUpper()

$l = $lastFive.length

do {

$lnFive += "_";
$l++;

} while ($l -lt 5)

$firstThree = "Jo";
$fnTHree = $firstThree.toUpper()

$f = $firstThree.length

do {

$fnThree += "_";
$f++;

} while ($f -lt 3)

$numID = "00"
$increment = 0;

$skyID = $lnFive + $fnThree + $numID + $increment

$exIDArray | foreach {
 if ($skyID -in $_)
{
$increment++;
}
}

$skyID = $lnFive + $fnThree + $numID + $increment

Write-Output $skyID

1 Ответ

0 голосов
/ 27 февраля 2019

Начнем с вопроса номера.У вас есть проверка, чтобы увидеть, существует ли уже созданный идентификатор, но когда это происходит, вы увеличиваете единицу на 1, а затем заново генерируете идентификатор, однако вы не выполняете эту же проверку еще раз, чтобы увидеть,новый идентификатор также существует.

Вместо этого вы хотите выполнить этот процесс сравнения / увеличения в цикле, который нарушает условие, что сгенерированный пользователь не существует.

Краткое примечание по сравнению $exIDArray | foreach { if ($skyID -in $_) {} }: нет необходимости перебирать $exIDArray, потому что оператор -in делает это за вас, поэтому вы можете просто сделать if ($skyID -in $exIDArray) {}, что я и делаюЯ буду использовать в этом примере цикла итерации:

$numID = "00"
$increment = 0

do {
    $increment++
    $skyID = $lnFive + $fnThree + $numID + $increment
} while ($skyID -in $exIDArray)

Это заменит все в вашем исходном коде с $numID = "00" до Write-Output.


Так что сНемедленный вопрос, я хочу обратить внимание на несколько других вещей.Например, в написанном коде (включая мой пример) будут учитываться только идентификаторы пользователей от 001 до 009, после чего вы получите 0010, что, вероятно, не было предназначено.

Чтобы помочь с этим, $increment должен использоваться сам по себе, а затем дополняться нулями, где это необходимо. Это можно сделать с помощью строки формата и оператора -f в PowerShell .

$increment = 0

do {
    $increment++
    $skyID = '{0}{1}{2:d3}' -f $lnFive,$fnThree,$increment
} while ($skyID -in $exIDArray)

Что касается заполнения строк имени и фамилии, эта часть:

do {

$lnFive += "_";
$l++;

} while ($l -lt 5)

Строки имеют удобные методы заполнения:

$lnFive = $lastFive.PadRight(5,'_')
$fnThree = $firstThree.PadRight(3,'_')

Число - это длина total , которую вы хотите, а затем она выясняет, сколько символов (еслилюбое) добавить.


Объединяя все вышеперечисленные элементы, давайте посмотрим, как может выглядеть модифицированный скрипт:

$exIDArray = @(
    "DOE__JO_000",
    "DOE_JO_001",
    "SMITHNAN000",
    "ZAHN_THO000"
)

$lastFive = "Doe"
$firstThree = "Jo"

$lnFive = $lastFive.ToUpper().PadRight(5,'_')
$fnThree = $firstThree.ToUpper().PadRight(3,'_')

$increment = 0;

do {
    $increment++
    $skyID = '{0}{1}{2:d3}' -f $lnFive,$fnThree,$increment
} while ($skyID -in $exIDArray)

Write-Output $skyID
...