如何动态填充多维数组?

时间:2018-06-08 10:28:25

标签: powershell matrix multidimensional-array dynamic

我正在尝试创建一个 n * m 矩阵,它将完成以下设计:

  1. 导入包含应用程序名称和项目名称对的CSV。
  2. 生成一个由动态命名和生成的数组构建的n * m矩阵,其第一个值是项目名称。
  3. 将每个可能的应用程序和项目组合与原始CSV进行比较,并使用true或false语句填充矩阵,以进行每次比较,无论是否存在。
  4. 我正在使用的第一个循环是返回一个我不理解的错误,即动态生成的数组名已经存在。

    代码:

    $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 :(得分:3)

首先,我会简化$ProjectArray$ApplicationArray的创建:

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

此外,您正在创建的内容称为"锯齿状" array(基本上是每个都有一个维度的数组数组),它与2维数组(一个具有2维的数组对象)不同。对于你的矩阵,最好创建一个实际的二维数组:

$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
    }
}