Как динамически заполнить многомерный массив? - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь создать матрицу n * m , которая будет иметь следующий дизайн:

  1. Импортировать файл CSV, содержащий пары имени приложения и имени проекта.
  2. Генерация матрицы * m, построенной из динамически именованных и сгенерированных массивов, первое значение которых является именем проекта.
  3. Сравните каждую возможную комбинацию приложения и проекта с исходным CSV и заполните матрицу истинным или ложнымоператоры для каждого сравнения, которое существует или не существует.

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

Код:

$Source = (Import-Csv "C:\Users\m012407\Desktop\DataBase 42\DB--Data\APPcsv - Copy.csv" -Delimiter ";" -Header ("Application", "Project"))

# An Array to hold each project by name. 
$projectName = $source | Select-Object Project -Unique
$ProjectArray = @("")
foreach ($project in $projectname) {
    $ProjectArray += $Project.Project 
}

# An Array to hold each application by name.    
$ApplicationName = $source | Select-Object Application -Unique
$ApplicationArray = @()
foreach ($App in $ApplicationName) {
    $ApplicationArray += $App.Application
}

# An Array to hold the Combined values of each EXISTING application and project combination. 
$ComparisonArray = @()         
$ComparisonSource = foreach ($Value in $Source) {
    $ComparisonString = $Value.Project + $Value.Application
    $ComparisonArray += $ComparisonString
}

# The Matrix, eventually n*m as each dynamically generated array is added to it
$Matrix = @()

##loop1 Now defunct
#for ($iP = 0; $iP -le $ProjectArray.count; $iP ++) {
#    New-Variable -Name Row$iP -Value @($ProjectArray[$iP])
#    $Matrix += $_
#}

Конечно, этот код еще не завершен, но во время тестирования он постоянно не может правильно добавить массивы Row$iP в матрицу вТаким образом, я могу назвать матрицу и дисплей.Сообщение об ошибке гласит, что переменная row$iP (для каждой попытки строки 1-20) уже существует.

Я искал другие посты и руководства в Интернете и не уверен, что я сделал, что помешало бы тому, что у меня сейчас работает.Очевидно, я упускаю что-то простое или не совсем понял что-то, поэтому любая помощь будет принята с благодарностью.

Благодаря помощи Ansgar Wiechers я немного изменил свой код для работы на этом моторе:

$Matrix = New-Object 'Object[,]' $ProjectArray.Count, $ApplicationArray.Count

for ($i=0; $i -lt $ProjectArray.Count; $i++) {
    for ($j=0; $j -lt $ApplicationArray.Count; $j++) {
        $Matrix[$i, $j] = $ProjectArray[$i] + $ApplicationArray[$j]
        if ($Matrix[$i, $j] -match $comparisonArray) {
            $Matrix[$i, $j] = $True
            } else {
            $Matrix[$i, $j] = $False
            }
     }
}

К сожалению, каждое значение матрицы ложно.Я буду продолжать подключаться к этому, хотя.

1 Ответ

0 голосов
/ 08 июня 2018

С одной стороны, я бы упростил создание $ProjectArray и $ApplicationArray:

$ProjectArray     = @($source | Select-Object -Expand Project -Unique)
$ApplicationArray = @($source | Select-Object -Expand Application -Unique)

Кроме того, то, что вы создаете, называется «зубчатым» массивом (в основном массив массивов спо одному измерению), что не совпадает с двумерным массивом (один объект массива с двумя измерениями).Для вашей матрицы было бы лучше создать фактический двумерный массив:

$Matrix = New-Object 'Object[,]' $ProjectArray.Count, $ApplicationArray.Count

, который позволил бы заполнить матрицу следующим образом:

$source | ForEach-Object {
    $row = $ProjectArray.IndexOf($_.Project)
    $col = $ApplicationArray.IndexOf($_.Application)

    $Matrix[$row, $col] = $true
}

Пустые поля интерпретируются какfalse, в качестве альтернативы вы можете инициализировать матрицу значениями $false перед обработкой элементов $source:

for ($i=0; $i -lt $ProjectArray.Count; $i++) {
    for ($j=0; $j -lt $ApplicationArray.Count; $j++) {
        $Matrix[$i, $j] = $false
    }
}
...